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?
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?
Risposte:
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)
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})
astype(float)e ottenere lo stesso risultato?
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
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.
np.sin(True).dtypeFai solo attenzione ai tipi di dati se esegui la matematica in virgola mobile: è float16 per me.
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.
boolbene le colonne.
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.
boolcolonne come per le intcolonne
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
È possibile utilizzare una trasformazione per il frame di dati:
df = pd.DataFrame(my_data condition)
df = df*1
Utilizzare Series.viewper convertire i valori booleani in numeri interi:
df["somecolumn"] = df["somecolumn"].view('i1')