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?
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?
Respuestas:
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)
somecolumn
. El uso astype(int)
fallará. Otro enfoque, que convierte True
a 1.0 y False
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)
[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
True
está 1
en Python, y del mismo modo False
es 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
: True
no será el mismo objeto que cualquier aleatorio 1
.
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"})
obtengo DataError: 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 las int
columnas
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
Puede usar una transformación para su marco de datos:
df = pd.DataFrame(my_data condition)
df = df*1
Uso Series.view
para convertir booleanos a enteros:
df["somecolumn"] = df["somecolumn"].view('i1')