Pandy konwertują zera i jedynki całkowite na wartość logiczną [duplikat]

Nov 23 2020

Mam ramkę danych, która zawiera jedną zakodowaną na gorąco kolumnę 0 i 1, która jest typu dtype int32.

a     b      h1      h2     h3
xy    za      0       0      1
ab    cd      1       0      0
pq    rs      0       1      0  

Chcę przekonwertować kolumny h1, h2 i h3 na boolean, więc oto co zrobiłem ...

df[df.columns[2:]].astype(bool)

Ale to zmieniło wszystkie wartości h1-h3 jako TRUE.

Ja też próbowałem

df[df.columns[2:]].map({0:False, 1:True})

ale to też nie działa. (AttributeError: obiekt „DataFrame” nie ma atrybutu „map”)

Jaki jest najlepszy sposób na przekonwertowanie określonych kolumn ramki danych z int320 i 1 na boolean ( True/ False)?

Odpowiedzi

2 jezrael Nov 23 2020 at 19:42

Możesz wybrać wszystkie kolumny według pozycji po pierwszych 2 za pomocą DataFrame.iloc, przekonwertować na wartość logiczną i przypisać z powrotem:

df.iloc[:, 2:] = df.iloc[:, 2:].astype(bool)
print (df)
    a   b     h1     h2     h3
0  xy  za  False  False   True
1  ab  cd   True  False  False
2  pq  rs  False   True  False

Lub utwórz słownik do konwersji nazw kolumn bez wcześniejszego 2:

df = df.astype(dict.fromkeys(df.columns[2:], bool))
print (df)
    a   b     h1     h2     h3
0  xy  za  False  False   True
1  ab  cd   True  False  False
2  pq  rs  False   True  False
3 RuthgerRighart Nov 23 2020 at 20:07

W rzeczywistości jest inna opcja, nie najbardziej Pythonic. Niemniej jednak podam to, może być przydatne, jeśli chcesz przekonwertować ciągi (np .: „Kot” kontra „Pies”) na Boolean (False, True) w jednym kroku:

df = pd.DataFrame({'a':['xy','ab','pq'], 'b':['za','cd','rs'], 'h1':[0,1,0], 'h2':[0,0,1], 'h3':[1,0,0]})

df = df.replace({0:False, 1:True})

Sprawdzanie typu danych:

df.dtypes

a     object
b     object
h1      bool
h2      bool
h3      bool
dtype: object
1 Arpan Nov 23 2020 at 19:59

Druga próba była całkiem bliska. Spróbuj tego

df[df.columns[2:]].applymap(bool)