Les pandas convertissent les zéros entiers et les uns en booléen [dupliquer]
J'ai un dataframe qui contient une colonne codée à chaud de 0 et de 1 qui est de type dtype int32
.
a b h1 h2 h3
xy za 0 0 1
ab cd 1 0 0
pq rs 0 1 0
Je veux convertir les colonnes h1, h2 et h3 en booléen alors voici ce que j'ai fait.
df[df.columns[2:]].astype(bool)
Mais cela a changé toutes les valeurs de h1-h3 comme TRUE
.
J'ai aussi essayé
df[df.columns[2:]].map({0:False, 1:True})
mais cela ne fonctionne pas non plus. (AttributeError: l'objet 'DataFrame' n'a pas d'attribut 'map')
Quelle est la meilleure façon de convertir des colonnes spécifiques de la trame de données de int32
0 et de 1 en booléen ( True
/ False
)?
Réponses
Vous pouvez sélectionner toutes les colonnes par positions après les 2 premières avec DataFrame.iloc, convertir en booléen et réattribuer:
df.iloc[:, 2:] = df.iloc[:, 2:].astype(bool)
print (df)
a b h1 h2 h3
0 xy za False False True
1 ab cd True False False
2 pq rs False True False
Ou créez un dictionnaire pour convertir les noms de colonnes sans d'abord 2
:
df = df.astype(dict.fromkeys(df.columns[2:], bool))
print (df)
a b h1 h2 h3
0 xy za False False True
1 ab cd True False False
2 pq rs False True False
Il existe en fait une autre option, pas la plus pythonique. Néanmoins, je vais le fournir, cela peut être utile si vous souhaitez convertir des chaînes (par exemple: 'Cat' contre 'Dog') en booléen (False, True) en une seule étape:
df = pd.DataFrame({'a':['xy','ab','pq'], 'b':['za','cd','rs'], 'h1':[0,1,0], 'h2':[0,0,1], 'h3':[1,0,0]})
df = df.replace({0:False, 1:True})
Vérification du type de données:
df.dtypes
a object
b object
h1 bool
h2 bool
h3 bool
dtype: object
Vous étiez assez proche de votre deuxième essai. Essaye ça
df[df.columns[2:]].applymap(bool)