Pandas konvertieren ganzzahlige Nullen und Einsen in boolesche [Duplikate]

Nov 23 2020

Ich habe einen Datenrahmen, der eine heißcodierte Spalte mit 0 und 1 enthält, die vom Typ d ist int32.

a     b      h1      h2     h3
xy    za      0       0      1
ab    cd      1       0      0
pq    rs      0       1      0  

Ich möchte die Spalten h1, h2 und h3 in Boolesche Werte konvertieren.

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

Dies änderte jedoch alle Werte von h1-h3 als TRUE.

Ich habe es auch versucht

df[df.columns[2:]].map({0:False, 1:True})

aber das funktioniert auch nicht. (AttributeError: Das Objekt 'DataFrame' hat kein Attribut 'map')

Was ist der beste Weg, um bestimmte Spalten des Datenrahmens von int320 und 1 in Boolesche Werte ( True/ False) zu konvertieren ?

Antworten

2 jezrael Nov 23 2020 at 19:42

Sie können alle Spalten nach Positionen nach den ersten 2 mit auswählen DataFrame.iloc, in Boolesche Werte konvertieren und zurück zuweisen:

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

Oder erstellen Sie ein Wörterbuch zum Konvertieren von Spaltennamen ohne vorherige 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

Es gibt tatsächlich eine andere Option, nicht die pythonischste. Trotzdem werde ich es bereitstellen, kann nützlich sein, wenn Sie Zeichenfolgen (z. B. 'Cat' versus 'Dog') in einem Schritt in Boolean (False, True) konvertieren möchten:

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})

Überprüfung auf Datentyp:

df.dtypes

a     object
b     object
h1      bool
h2      bool
h3      bool
dtype: object
1 Arpan Nov 23 2020 at 19:59

Sie waren mit Ihrem zweiten Versuch ziemlich nah dran. Versuche dies

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