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?

Simon Righley
źródło
1
Jakie dalsze obliczenia są wymagane?
Jon Clements
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:

df["somecolumn"] = df["somecolumn"].astype(int)
Użytkownik
źródło
5
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
          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
shubhamgoel27
źródło
1
Jakie są zalety tego rozwiązania?
AMC
44

Truejest 1w Pythonie, i podobnie Falsejest 0* :

>>> 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ż 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- Truenie będzie to ten sam obiekt, co dowolny losowy 1.

Gareth Latty
źródło
2
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
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
Jeff
źródło
2

Możesz użyć transformacji dla swojej ramki danych:

df = pd.DataFrame(my_data condition)

przekształcanie Prawda / Fałsz w 1/0

df = df*1
Bruno Benevides
źródło
Jest to identyczne z rozwiązaniem opublikowanym 3 lata wcześniej.
AMC
1

Służy Series.viewdo konwersji wartości logicznych na liczby całkowite:

df["somecolumn"] = df["somecolumn"].view('i1')
jezrael
źródło
0

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
kaishu
źródło