¿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?


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)

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

¿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.


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

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

Esto es idéntico a esta solución , publicada 3 años antes.
AMC

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.