it-swarm.com.de

Ersetzen von Spaltenwerten in einem Pandas-DataFrame

Ich versuche, die Werte in einer Spalte eines Datenrahmens zu ersetzen. Die Spalte ('weiblich') enthält nur die Werte 'weiblich' und 'männlich'. 

Ich habe folgendes versucht:

w['female']['female']='1'
w['female']['male']='0' 

Erhalten Sie jedoch genau dieselbe Kopie der vorherigen Ergebnisse.

Im Idealfall möchte ich eine Ausgabe erhalten, die der folgenden Schleife elementweise ähnelt.

if w['female'] =='female':
    w['female'] = '1';
else:
    w['female'] = '0';

Ich habe in der Dokumentation der Gotchas nachgesehen ( http://pandas.pydata.org/pandas-docs/stable/gotchas.html ), kann aber nicht herausfinden, warum nichts passiert.

Jede Hilfe wird geschätzt.

74
Black

Wenn ich richtig verstehe, willst du so etwas:

w['female'] = w['female'].map({'female': 1, 'male': 0})

(Hier konvertiere ich die Werte in Zahlen anstatt in Zeichenfolgen, die Zahlen enthalten. Sie können sie in "1" und "0" konvertieren, wenn Sie wirklich wollen, aber ich bin mir nicht sicher, warum Sie das wollen.)

Der Grund, warum Ihr Code nicht funktioniert, ist, dass die Verwendung von ['female'] für eine Spalte (der zweite 'female' in Ihrem w['female']['female']) nicht "Zeilen auswählen, in denen der Wert 'female' ist" bedeutet. Es bedeutet, Zeilen auszuwählen, bei denen der index 'female' ist, von denen möglicherweise keine in Ihrem DataFrame vorhanden sind.

154
BrenBarn

Sie können eine Teilmenge eines Datenrahmens mit loc bearbeiten:

df.loc[<row selection>, <column selection>]

In diesem Fall:

w.loc[w.female != 'female', 'female'] = 0
w.loc[w.female == 'female', 'female'] = 1
82
Jimmy Petersson
w.female.replace(to_replace=dict(female=1, male=0), inplace=True)

Siehe pandas.DataFrame.replace () docs .

24
jfs

Leichte Variation:

w.female.replace(['male', 'female'], [1, 0], inplace=True)
22
deckard

Das sollte auch funktionieren:

w.female[w.female == 'female'] = 1 
w.female[w.female == 'male']   = 0
14
Nick Crawford

Sie können auch apply mit .get Verwenden, d. H.

w['female'] = w['female'].apply({'male':0, 'female':1}.get):

w = pd.DataFrame({'female':['female','male','female']})
print(w)

Datenrahmen w:

   female
0  female
1    male
2  female

Verwenden Sie apply, um Werte aus dem Wörterbuch zu ersetzen:

w['female'] = w['female'].apply({'male':0, 'female':1}.get)
print(w)

Ergebnis:

   female
0       1
1       0
2       1 

Hinweis:apply with dictionary sollte verwendet werden, wenn alle möglichen Werte der Spalten im Datenrahmen im Wörterbuch definiert sind, andernfalls ist es leer für diejenigen, die nicht im Wörterbuch definiert sind.

10
student

Alternativ gibt es für diese Zuordnungen die integrierte Funktion pd.get_dummies:

w['female'] = pd.get_dummies(w['female'],drop_first = True)

Dies gibt Ihnen einen Datenrahmen mit zwei Spalten, eine für jeden Wert, der in w ['female'] vorkommt, von dem Sie die erste löschen (da Sie auf den verbleibenden Wert schließen können). Die neue Spalte wird automatisch als Zeichenfolge bezeichnet, die Sie ersetzt haben. 

Dies ist besonders nützlich, wenn Sie kategoriale Variablen mit mehr als zwei möglichen Werten haben. Diese Funktion erstellt so viele Dummy-Variablen, die zur Unterscheidung aller Fälle erforderlich sind. Achten Sie darauf, dass Sie nicht den gesamten Datenrahmen einer einzelnen Spalte zuordnen. Wenn w ['female'] "männlich", "female" oder "neutral" sein könnte, gehen Sie folgendermaßen vor:

w = pd.concat([w, pd.get_dummies(w['female'], drop_first = True)], axis = 1])
w.drop('female', axis = 1, inplace = True)

Dann stehen Ihnen zwei neue Spalten zur Verfügung, die Ihnen die Dummy-Codierung von 'female' geben, und Sie haben die Spalte mit den Strings losgelassen. 

7
galliwuzz

Das ist sehr kompakt:

w['female'][w['female'] == 'female']=1
w['female'][w['female'] == 'male']=0

Ein weiterer guter:

w['female'] = w['female'].replace(regex='female', value=1)
w['female'] = w['female'].replace(regex='male', value=0)
4
Azz

In pandas gibt es auch eine Funktion namens factorize , mit der Sie diese Art von Arbeit automatisch ausführen können. Es wandelt Etiketten in Zahlen um: ['male', 'female', 'male'] -> [0, 1, 0]. Weitere Informationen finden Sie in this answer.

1
Roald

Ich denke, als Antwort sollte darauf hingewiesen werden, welche Art von Objekt Sie in allen oben genannten Methoden erhalten: Ist es Series oder DataFrame?.

Wenn Sie eine Spalte über w.female. oder w[[2]] erhalten (wobei 2 die Nummer Ihrer Spalte ist), erhalten Sie DataFrame ..__ zurück. In diesem Fall können Sie DataFrame-Methoden wie .replace verwenden.

Wenn Sie .loc oder iloc verwenden, erhalten Sie die Serien zurück, und die Serie verfügt nicht über die .replace-Methode. Daher sollten Sie Methoden wie apply, map usw. verwenden.

0
Alex-droid AD