2013-06-29 18 views
44

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

MODIFICA: Le risposte seguenti non sembrano tenere nel caso di numpy che, dato un array con valori interi e True/False, restituisce dtype=object su tale array. Per procedere con ulteriori calcoli in numpy, ho dovuto impostare esplicitamente np_values = np.array(df.values, dtype = np.float64).

+0

Quali ulteriori calcoli sono richiesti? –

risposta

22

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

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

Si dovrebbe essere in grado di eseguire qualsiasi operazione che si desidera 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, nessun lavoro necessario - già h ciao quello che stai cercando.

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

+0

Fantastico, non lo sapevo, grazie! –

+0

Basta fare attenzione con i tipi di dati se si fa il calcolo in virgola mobile: 'np.sin (True) .dtype' è float16 per me. – jorgeca

+1

Ho un dataframe con una colonna booleana, e posso chiamare 'df.my_column.mean()' bene (come intendi), ma quando provo: 'df.groupby (" some_other_column "). Agg ({"my_column": "mean"}) "Ottengo" DataError: nessun tipo numerico da aggregare ", quindi sembra che siano ** NOT ** sempre uguali. Solo FYI. – dwanderson

14

È anche possibile farlo direttamente sui telai

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

Proprio per rispondere in modo molto esplicito la questione di come convertire una singola colonna di valori booleani ad una colonna di numeri interi 1 o 0:

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

18

Basta moltiplicare il vostro dataframe da 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