Wie kann ich in einem Pandas DataFrame True / False 1/0 zuordnen?
133
Ich habe eine Spalte in Python Pandas DataFrame, die boolesche True / False-Werte enthält, aber für weitere Berechnungen benötige ich eine 1/0 Darstellung. Gibt es eine schnelle Möglichkeit für Pandas / Numpy, das zu tun?
Um @JonClements zu parrotieren, warum müssen Sie bool in int konvertieren, um es für die Berechnung zu verwenden? bool arbeitet direkt mit Arithmetik (da es intern ein int ist).
cs95
Antworten:
274
Eine prägnante Methode zum Konvertieren einer einzelnen Spalte mit Booleschen Werten in eine Spalte mit Ganzzahlen 1 oder 0:
Der Eckfall ist, wenn NaN-Werte in vorhanden sind somecolumn. Die Verwendung astype(int)schlägt dann fehl. Ein anderer Ansatz, der unter Beibehaltung der NaN-Werte Truein 1.0 und False0.0 (Floats) konvertiert wird , besteht darin, df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
Folgendes
@DustByte Guter Fang!
Homunculus Reticulli
@DustByte Könnten Sie nicht einfach astype(float)das gleiche Ergebnis erzielen ?
AMC
65
Multiplizieren Sie einfach Ihren Datenrahmen mit 1 (int)
[1]: data = pd.DataFrame([[True,False,True],[False,False,True]])[2]:print data0120TrueFalseTrue1FalseFalseTrue[3]:print data*101201011001
Sie sollten in der Lage sein, alle gewünschten Operationen an ihnen auszuführen, indem Sie sie einfach so behandeln, als wären sie Zahlen, da es sich um Zahlen handelt:
>>> issubclass(bool, int)True>>>True*55
Um Ihre Frage zu beantworten, ist keine Arbeit erforderlich - Sie haben bereits das, wonach Sie suchen.
* Hinweis I Verwendung ist als englisches Wort, nicht das Python Schlüsselwort is- Truewird das gleiche Objekt wie jeder zufällig nicht sein 1.
np.sin(True).dtypeSeien Sie vorsichtig mit Datentypen, wenn Sie Gleitkomma- Berechnungen durchführen : ist float16 für mich.
Jorgeca
9
Ich habe einen Datenrahmen mit einer booleschen Spalte, und ich kann gut aufrufen df.my_column.mean()(wie Sie andeuten), aber wenn ich versuche: df.groupby("some_other_column").agg({"my_column":"mean"})Ich verstehe DataError: No numeric types to aggregate, so scheint es, dass sie NICHT immer gleich sind. Nur zur Info.
Dwanderson
In Pandas Version 24 (und möglicherweise früher) können Sie boolSpalten problemlos aggregieren .
BallpointBen
1
Es sieht so aus, als würde numpy auch Fehler mit booleschen Typen TypeError: numpy boolean subtract, the auslösen : -` Operator, ist veraltet, verwenden Sie ^stattdessen die Funktion bitwise_xor , den Operator oder die Funktion static_xor.` Die Antwort von @ User behebt dies.
Amadou Kone
Ein weiterer Grund, warum es nicht dasselbe ist: df.col1 + df.col2 + df.col3 funktioniert nicht für boolSpalten wie für intSpalten
colorlace
22
Sie können dies auch direkt auf Frames tun
In[104]: df =DataFrame(dict(A =True, B =False),index=range(3))In[105]: dfOut[105]:
A B0TrueFalse1TrueFalse2TrueFalseIn[106]: df.dtypesOut[106]:
A bool
B bool
dtype: objectIn[107]: df.astype(int)Out[107]:
A B010110210In[108]: df.astype(int).dtypesOut[108]:
A int64
B int64
dtype: object
Antworten:
Eine prägnante Methode zum Konvertieren einer einzelnen Spalte mit Booleschen Werten in eine Spalte mit Ganzzahlen 1 oder 0:
quelle
somecolumn
. Die Verwendungastype(int)
schlägt dann fehl. Ein anderer Ansatz, der unter Beibehaltung der NaN-WerteTrue
in 1.0 undFalse
0.0 (Floats) konvertiert wird , besteht darin,df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
astype(float)
das gleiche Ergebnis erzielen ?Multiplizieren Sie einfach Ihren Datenrahmen mit 1 (int)
quelle
True
ist1
in Python, und ebensoFalse
ist0
* :Sie sollten in der Lage sein, alle gewünschten Operationen an ihnen auszuführen, indem Sie sie einfach so behandeln, als wären sie Zahlen, da es sich um Zahlen handelt:
Um Ihre Frage zu beantworten, ist keine Arbeit erforderlich - Sie haben bereits das, wonach Sie suchen.
* Hinweis I Verwendung ist als englisches Wort, nicht das Python Schlüsselwort
is
-True
wird das gleiche Objekt wie jeder zufällig nicht sein1
.quelle
np.sin(True).dtype
Seien Sie vorsichtig mit Datentypen, wenn Sie Gleitkomma- Berechnungen durchführen : ist float16 für mich.df.my_column.mean()
(wie Sie andeuten), aber wenn ich versuche:df.groupby("some_other_column").agg({"my_column":"mean"})
Ich versteheDataError: No numeric types to aggregate
, so scheint es, dass sie NICHT immer gleich sind. Nur zur Info.bool
Spalten problemlos aggregieren .TypeError: numpy boolean subtract, the
auslösen : -` Operator, ist veraltet, verwenden Sie^
stattdessen die Funktion bitwise_xor , den Operator oder die Funktion static_xor.` Die Antwort von @ User behebt dies.bool
Spalten wie fürint
SpaltenSie können dies auch direkt auf Frames tun
quelle
Sie können eine Transformation für Ihren Datenrahmen verwenden:
True / False in 1/0 transformieren
quelle
Verwendung
Series.view
zum Konvertieren von Booleschen in Ganzzahlen:quelle