2013-06-29 14 views
44

Mam kolumnę w Pythonie pandas DataFrame, która ma boolean wartości True/False, ale do dalszych obliczeń potrzebuję 1/0 reprezentacji. Czy istnieje szybki pandas/numpy sposób to zrobić?python pandas/numpy Prawda/False to 1/0 mapowanie

EDYCJA: Poniższe odpowiedzi wydają się nie mieć w przypadku numpy, że w przypadku tablicy zawierającej zarówno liczby całkowite, jak i wartości True/False, zwracana jest dtype=object w takiej tablicy. Aby kontynuować dalsze obliczenia w numpy, musiałem ustawić wyraźnie np_values = np.array(df.values, dtype = np.float64).

+0

Jakie dalsze obliczenia są wymagane? –

Odpowiedz

22

True jest 1 w Pythonie, podobnie False jest 0*:

>>> True == 1 
True 
>>> False == 0 
True 

Powinieneś być w stanie wykonywać żadnych czynności, które mają na nich po prostu traktując je tak, jakby były numery, jak oni numery:

>>> issubclass(bool, int) 
True 
>>> True * 5 
5 

Tak, aby odpowiedzieć na to pytanie, nie ma potrzeby pracy - już h ave, czego szukasz.

* Uwaga używam jest jak angielskie słowo, a nie słowa kluczowego Pythona is - True nie będzie taki sam przedmiot jak każdy losowej 1.

+0

Świetnie, nie wiedziałem o tym, dziękuję! –

+0

Uważaj przy typach danych, jeśli wykonujesz obliczenia zmiennoprzecinkowe: 'np.sin (True) .dtype' to float16 dla mnie. – jorgeca

+1

Mam ramkę danych z kolumną boolowską i mogę nazwać 'df.my_column.mean()' po prostu dobrze (jak sugerujesz), ale gdy próbuję: 'df.groupby (" some_other_column "). Agg ({"my_column": "mean"}) 'Otrzymuję' DataError: Brak typów liczbowych do agregacji', więc wygląda na to, że są ** NOT ** zawsze takie same. Po prostu dla FYI. – dwanderson

14

Można też to zrobić bezpośrednio na 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 
103

Wystarczy bardzo jednoznacznie odpowiedzieć na pytanie, w jaki sposób przekonwertować pojedynczą kolumnę wartości logicznych do kolumny liczb całkowitych 1 lub 0:

df.somecolumn = df.somecolumn.astype(int)

18

Wystarczy pomnożyć swój Dataframe o 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