¿Cómo puedo asignar Verdadero / Falso a 1/0 en un Pandas DataFrame?

134

Tengo una columna en Python pandas DataFrame que tiene valores booleanos True / False, pero para cálculos adicionales necesito una representación 1/0. ¿Hay una forma rápida de pandas / numpy de hacer eso?

Simon Righley
fuente
1
¿Qué otros cálculos se requieren?
Jon Clements
Para loro @JonClements, ¿por qué necesita convertir bool a int para usar en el cálculo? bool trabaja con aritmética directamente (ya que es internamente un int).
cs95

Respuestas:

277

Una forma sucinta de convertir una sola columna de valores booleanos en una columna de enteros 1 o 0:

df["somecolumn"] = df["somecolumn"].astype(int)
Usuario
fuente
44
El caso de la esquina es si hay valores NaN en somecolumn. El uso astype(int)fallará. Otro enfoque, que convierte Truea 1.0 y Falsea 0.0 (flotantes) mientras conserva los valores de NaN es hacer:df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
DustByte
@DustByte Buena captura!
Homúnculo Reticulli
@DustByte ¿No podrías simplemente usar astype(float)y obtener el mismo resultado?
AMC
65

Simplemente multiplique su Dataframe por 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
fuente
¿Cuáles son las ventajas de esta solución?
AMC
44

Trueestá 1en Python, y del mismo modo Falsees 0* :

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

Debería poder realizar cualquier operación que desee con solo tratarlos como si fueran números, ya que son números:

>>> issubclass(bool, int)
True
>>> True * 5
5

Entonces, para responder a su pregunta, no es necesario trabajar: ya tiene lo que está buscando.

* Tenga en cuenta que uso es como una palabra en inglés, no la palabra clave de Python is: Trueno será el mismo objeto que cualquier aleatorio 1.

Gareth Latty
fuente
1
Solo tenga cuidado con los tipos de datos si hace cálculos de coma flotante: np.sin(True).dtypees float16 para mí.
jorgeca
9
Tengo un marco de datos con una columna booleana, y puedo llamar df.my_column.mean()bien (como implica), pero cuando lo intento: df.groupby("some_other_column").agg({"my_column":"mean"})obtengo DataError: No numeric types to aggregate, por lo que parece que NO siempre son lo mismo. Solo para tu información.
dwanderson
En la versión 24 de pandas (y tal vez antes) puede agregar boolcolumnas muy bien.
BallpointBen
1
Parece que numpy también arroja errores con tipos booleanos: TypeError: numpy boolean subtract, the -` operador, está en desuso, use bitwise_xor, el ^operador o la función logical_xor en su lugar.` Utilizar la respuesta de @ Usuario soluciona esto.
Amadou Kone
Otra razón por la que no es lo mismo: df.col1 + df.col2 + df.col3 no funciona para las boolcolumnas como lo hace para las intcolumnas
colorlace
22

También puede hacer esto directamente en marcos

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
fuente
2

Puede usar una transformación para su marco de datos:

df = pd.DataFrame(my_data condition)

transformando verdadero / falso en 1/0

df = df*1
Bruno Benevides
fuente
Esto es idéntico a esta solución , publicada 3 años antes.
AMC
1

Uso Series.viewpara convertir booleanos a enteros:

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