¿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?
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:
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
0120TrueFalseTrue1FalseFalseTrue[3]:print data*101201011001
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
0TrueFalse1TrueFalse2TrueFalseIn[106]: df.dtypes
Out[106]:
A bool
B bool
dtype: object
In[107]: df.astype(int)Out[107]:
A B
010110210In[108]: df.astype(int).dtypes
Out[108]:
A int64
B int64
dtype: object
Respuestas:
Una forma sucinta de convertir una sola columna de valores booleanos en una columna de enteros 1 o 0:
fuente
somecolumn
. El usoastype(int)
fallará. Otro enfoque, que convierteTrue
a 1.0 yFalse
a 0.0 (flotantes) mientras conserva los valores de NaN es hacer:df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
astype(float)
y obtener el mismo resultado?Simplemente multiplique su Dataframe por 1 (int)
fuente
True
está1
en Python, y del mismo modoFalse
es0
* :Debería poder realizar cualquier operación que desee con solo tratarlos como si fueran números, ya que son números:
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
:True
no será el mismo objeto que cualquier aleatorio1
.fuente
np.sin(True).dtype
es float16 para mí.df.my_column.mean()
bien (como implica), pero cuando lo intento:df.groupby("some_other_column").agg({"my_column":"mean"})
obtengoDataError: No numeric types to aggregate
, por lo que parece que NO siempre son lo mismo. Solo para tu información.bool
columnas muy bien.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.bool
columnas como lo hace para lasint
columnasTambién puede hacer esto directamente en marcos
fuente
Puede usar una transformación para su marco de datos:
transformando verdadero / falso en 1/0
fuente
Uso
Series.view
para convertir booleanos a enteros:fuente