Les pandas convertissent les zéros entiers et les uns en booléen [dupliquer]

Nov 23 2020

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 int320 et de 1 en booléen ( True/ False)?

Réponses

2 jezrael Nov 23 2020 at 19:42

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
3 RuthgerRighart Nov 23 2020 at 20:07

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
1 Arpan Nov 23 2020 at 19:59

Vous étiez assez proche de votre deuxième essai. Essaye ça

df[df.columns[2:]].applymap(bool)