Come posso mappare True / False su 1/0 in un Pandas DataFrame?


134

Ho una colonna in DataFrame python panda che ha valori True / False booleani, ma per ulteriori calcoli ho bisogno della rappresentazione 1/0. C'è un panda veloce / un modo intorpidito per farlo?


1
Quali ulteriori calcoli sono richiesti?
Jon Clements

Per fare da parrot a @JonClements, perché devi convertire bool in int per usarlo nel calcolo? bool lavora direttamente con l'aritmetica (poiché è internamente un int).
cs95,

Risposte:


277

Un modo sintetico per convertire una singola colonna di valori booleani in una colonna di numeri interi 1 o 0:

df["somecolumn"] = df["somecolumn"].astype(int)

4
Il caso d'angolo è se ci sono valori NaN in somecolumn. L'uso astype(int)fallirà quindi. Un altro approccio, che converte Truein 1.0 e Falsein 0.0 (float) preservando i valori NaN è quello di fare:df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
DustByte

@DustByte Buona cattura!
Homunculus Reticulli,

@DustByte Non potresti semplicemente usare astype(float)e ottenere lo stesso risultato?
AMC,

65

Moltiplica il tuo Dataframe per 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

Quali sono i vantaggi di questa soluzione?
AMC,

44

Trueè 1in Python, e allo stesso modo Falseè 0* :

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

Dovresti essere in grado di eseguire tutte le operazioni che desideri su di loro semplicemente trattandoli come se fossero numeri, in quanto sono numeri:

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

Quindi, per rispondere alla tua domanda, non è necessario alcun lavoro: hai già quello che stai cercando.

* Nota che uso è come una parola inglese, non la parola chiave Python is- Truenon sarà lo stesso oggetto di qualsiasi casuale 1.


1
np.sin(True).dtypeFai solo attenzione ai tipi di dati se esegui la matematica in virgola mobile: è float16 per me.
Jorgeca,

9
Ho un dataframe con una colonna booleana e posso chiamare df.my_column.mean()bene (come intendi), ma quando ci provo: df.groupby("some_other_column").agg({"my_column":"mean"})capisco DataError: No numeric types to aggregate, quindi sembra che NON siano sempre gli stessi. Cordiali saluti.
Dwanderson,

Nella versione 24 di Panda (e forse prima) puoi aggregare boolbene le colonne.
BallpointBen,

1
Sembra che numpy generi anche errori con tipi booleani: TypeError: numpy boolean subtract, the -` operatore, è deprecato, usa invece la funzione bitwise_xor, l' ^operatore o la logica_xor. L'uso della risposta di @ User risolve questo problema.
Amadou Kone,

Un altro motivo non è lo stesso: df.col1 + df.col2 + df.col3 non funziona per le boolcolonne come per le intcolonne
colorlace

22

Puoi anche farlo direttamente su Frame

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

2

È possibile utilizzare una trasformazione per il frame di dati:

df = pd.DataFrame(my_data condition)

trasformando True / False in 1/0

df = df*1

Questo è identico a questa soluzione , pubblicata 3 anni prima.
AMC,

1

Utilizzare Series.viewper convertire i valori booleani in numeri interi:

df["somecolumn"] = df["somecolumn"].view('i1')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.