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 True
in 1.0 e False
in 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
è 1
in 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
- True
non sarà lo stesso oggetto di qualsiasi casuale 1
.
np.sin(True).dtype
Fai 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.
bool
bene 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.
bool
colonne come per le int
colonne
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.view
per convertire i valori booleani in numeri interi:
df["somecolumn"] = df["somecolumn"].view('i1')