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?

Simon Righley
quelle
1
Welche weiteren Berechnungen sind erforderlich?
Jon Clements
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:

df["somecolumn"] = df["somecolumn"].astype(int)
Benutzer
quelle
4
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 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
shubhamgoel27
quelle
Was sind die Vorteile dieser Lösung?
AMC
44

Trueist 1in Python, und ebenso Falseist 0* :

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

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 * 5
5

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.

Gareth Latty
quelle
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]: 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
Jeff
quelle
2

Sie können eine Transformation für Ihren Datenrahmen verwenden:

df = pd.DataFrame(my_data condition)

True / False in 1/0 transformieren

df = df*1
Bruno Benevides
quelle
Dies ist identisch mit dieser Lösung , die 3 Jahre zuvor veröffentlicht wurde.
AMC
1

Verwendung Series.viewzum Konvertieren von Booleschen in Ganzzahlen:

df["somecolumn"] = df["somecolumn"].view('i1')
jezrael
quelle