Jak mogę zmapować True / False na 1/0 w Pandas DataFrame?
145
Mam kolumnę w pandach Pythona DataFrame, która ma wartości logiczne True / False, ale do dalszych obliczeń potrzebuję reprezentacji 1/0. Czy jest na to szybki / odrętwiały sposób?
Aby papugować @JonClements, dlaczego musisz przekonwertować bool na int, aby użyć go w obliczeniach? bool działa bezpośrednio z arytmetyką (ponieważ wewnętrznie jest int).
cs95
Odpowiedzi:
302
Zwięzły sposób konwersji pojedynczej kolumny wartości logicznych na kolumnę liczb całkowitych 1 lub 0:
Narożny przypadek ma miejsce, jeśli istnieją wartości NaN w somecolumn. Używanie astype(int)zakończy się niepowodzeniem. Innym podejściem, które konwertuje Truedo 1,0 i Falsedo 0,0 (zmiennoprzecinkowo), zachowując wartości NaN, jest wykonanie:df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
DustByte
@DustByte Dobry chwyt!
Homunculus Reticulli
@DustByte Czy nie możesz po prostu użyć astype(float)i uzyskać tego samego wyniku?
AMC
jeśli wartością jest tekst i mała litera „prawda” lub „fałsz”, najpierw wykonaj astype (bool] .astype (int), a konwersja będzie działać. Dane wyjściowe Sas to bools jako małe litery prawda i fałsz.
Golden Lion
71
Po prostu pomnóż swoją Dataframe przez 1 (int)
[1]: data = pd.DataFrame([[True, False, True], [False, False, True]])
[2]: print data
0120TrueFalseTrue1FalseFalseTrue
[3]: print data*101201011001
Po prostu uważaj na typy danych, jeśli wykonujesz obliczenia zmiennoprzecinkowe: np.sin(True).dtypedla mnie jest to float16.
jorgeca
9
Mam ramkę danych z kolumną boolowską i mogę zadzwonić df.my_column.mean()dobrze (jak sugerujesz), ale kiedy próbuję: df.groupby("some_other_column").agg({"my_column":"mean"})otrzymuję DataError: No numeric types to aggregate, więc wygląda na to, że NIE zawsze są takie same. Po prostu FYI.
dwanderson
W pandach w wersji 24 (a może i wcześniejszych) możesz dobrze agregować boolkolumny.
BallpointBen
1
Wygląda na to, że numpy również generuje błędy z typami logicznymi: TypeError: numpy boolean subtract, the -` operator, jest przestarzały, zamiast tego użyj bitwise_xor, ^operatora lub funkcji logical_xor.` Użycie odpowiedzi @ User rozwiązuje ten problem.
Amadou Kone
Kolejny powód to nie to samo: df.col1 + df.col2 + df.col3 nie działa dla boolkolumn tak jak dla intkolumn
colorlace
22
Możesz to również zrobić bezpośrednio w ramkach
In [104]: df = DataFrame(dict(A = True, B = False),index=range(3))
In [105]: df
Out[105]:
A B
0TrueFalse1TrueFalse2TrueFalse
In [106]: df.dtypes
Out[106]:
A bool
B bool
dtype: object
In [107]: df.astype(int)
Out[107]:
A B
010110210
In [108]: df.astype(int).dtypes
Out[108]:
A int64
B int64
dtype: object
Musiałem zmapować FAKE / REAL na 0/1, ale nie mogłem znaleźć właściwej odpowiedzi.
Poniżej dowiesz się, jak zmapować nazwę kolumny `` typ '', która ma wartości FAKE / REAL na 0/1 (Uwaga: podobne można zastosować do dowolnej nazwy i wartości kolumny)
Odpowiedzi:
Zwięzły sposób konwersji pojedynczej kolumny wartości logicznych na kolumnę liczb całkowitych 1 lub 0:
df["somecolumn"] = df["somecolumn"].astype(int)
źródło
somecolumn
. Używanieastype(int)
zakończy się niepowodzeniem. Innym podejściem, które konwertujeTrue
do 1,0 iFalse
do 0,0 (zmiennoprzecinkowo), zachowując wartości NaN, jest wykonanie:df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
astype(float)
i uzyskać tego samego wyniku?Po prostu pomnóż swoją Dataframe przez 1 (int)
[1]: data = pd.DataFrame([[True, False, True], [False, False, True]]) [2]: print data 0 1 2 0 True False True 1 False False True [3]: print data*1 0 1 2 0 1 0 1 1 0 0 1
źródło
True
jest1
w Pythonie, i podobnieFalse
jest0
* :>>> True == 1 True >>> False == 0 True
Powinieneś być w stanie wykonać na nich dowolne operacje, po prostu traktując je tak, jakby były liczbami, ponieważ są liczbami:
>>> issubclass(bool, int) True >>> True * 5 5
Aby odpowiedzieć na Twoje pytanie, nie musisz nic robić - masz już to, czego szukasz.
* Uwaga, którego używam, jest słowem angielskim, a nie słowem kluczowym Python
is
-True
nie będzie to ten sam obiekt, co dowolny losowy1
.źródło
np.sin(True).dtype
dla mnie jest to float16.df.my_column.mean()
dobrze (jak sugerujesz), ale kiedy próbuję:df.groupby("some_other_column").agg({"my_column":"mean"})
otrzymujęDataError: No numeric types to aggregate
, więc wygląda na to, że NIE zawsze są takie same. Po prostu FYI.bool
kolumny.TypeError: numpy boolean subtract, the
-` operator, jest przestarzały, zamiast tego użyj bitwise_xor,^
operatora lub funkcji logical_xor.` Użycie odpowiedzi @ User rozwiązuje ten problem.bool
kolumn tak jak dlaint
kolumnMożesz to również zrobić bezpośrednio w ramkach
In [104]: df = DataFrame(dict(A = True, B = False),index=range(3)) In [105]: df Out[105]: A B 0 True False 1 True False 2 True False In [106]: df.dtypes Out[106]: A bool B bool dtype: object In [107]: df.astype(int) Out[107]: A B 0 1 0 1 1 0 2 1 0 In [108]: df.astype(int).dtypes Out[108]: A int64 B int64 dtype: object
źródło
Możesz użyć transformacji dla swojej ramki danych:
przekształcanie Prawda / Fałsz w 1/0
df = df*1
źródło
Służy
Series.view
do konwersji wartości logicznych na liczby całkowite:df["somecolumn"] = df["somecolumn"].view('i1')
źródło
Musiałem zmapować FAKE / REAL na 0/1, ale nie mogłem znaleźć właściwej odpowiedzi.
Poniżej dowiesz się, jak zmapować nazwę kolumny `` typ '', która ma wartości FAKE / REAL na 0/1
(Uwaga: podobne można zastosować do dowolnej nazwy i wartości kolumny)
df.loc[df['type'] == 'FAKE', 'type'] = 0 df.loc[df['type'] == 'REAL', 'type'] = 1
źródło