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