J'ai une colonne en python pandas DataFrame qui a des valeurs booléennes True / False, mais pour d'autres calculs, j'ai besoin d'une représentation 1/0. Existe-t-il un moyen rapide de faire ça avec pandas / numpy?
J'ai une colonne en python pandas DataFrame qui a des valeurs booléennes True / False, mais pour d'autres calculs, j'ai besoin d'une représentation 1/0. Existe-t-il un moyen rapide de faire ça avec pandas / numpy?
Réponses:
Une façon succincte de convertir une seule colonne de valeurs booléennes en une colonne d'entiers 1 ou 0:
df["somecolumn"] = df["somecolumn"].astype(int)
somecolumn
. L'utilisation astype(int)
échouera alors. Une autre approche, qui convertit True
en 1.0 et False
en 0.0 (floats) tout en préservant les valeurs NaN est de faire:df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
astype(float)
et obtenir le même résultat?
Multipliez simplement votre Dataframe par 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, et False
est également 0
* :
>>> True == 1
True
>>> False == 0
True
Vous devriez pouvoir effectuer toutes les opérations que vous souhaitez sur eux en les traitant simplement comme s'il s'agissait de nombres, car ce sont des nombres:
>>> issubclass(bool, int)
True
>>> True * 5
5
Donc pour répondre à votre question, aucun travail n'est nécessaire - vous avez déjà ce que vous recherchez.
* L' utilisation Remarque I est comme un mot anglais, pas le mot - clé Python is
- True
ne sera pas le même objet que tout au hasard 1
.
np.sin(True).dtype
Faites juste attention avec les types de données si vous faites des calculs en virgule flottante: est float16 pour moi.
df.my_column.mean()
très bien (comme vous l'impliquez), mais quand j'essaye: df.groupby("some_other_column").agg({"my_column":"mean"})
j'obtiens DataError: No numeric types to aggregate
, donc il semble qu'ils ne sont PAS toujours les mêmes. Juste FYI.
bool
colonnes.
TypeError: numpy boolean subtract, the
opérateur -`, est obsolète, utilisez le bitwise_xor, l' ^
opérateur ou la fonction logical_xor à la place.
bool
colonnes comme il le fait pour les int
colonnes
Vous pouvez également le faire directement sur les cadres
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
Vous pouvez utiliser une transformation pour votre bloc de données:
df = pd.DataFrame(my_data condition)
df = df*1
Utilisez Series.view
pour convertir un booléen en nombres entiers:
df["somecolumn"] = df["somecolumn"].view('i1')