Pandy konwertują zera i jedynki całkowite na wartość logiczną [duplikat]
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 int32
0 i 1 na boolean ( True
/ False
)?
Odpowiedzi
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
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
Druga próba była całkiem bliska. Spróbuj tego
df[df.columns[2:]].applymap(bool)