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.
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.
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
w.female.replace(to_replace=dict(female=1, male=0), inplace=True)
Siehe pandas.DataFrame.replace () docs .
Leichte Variation:
w.female.replace(['male', 'female'], [1, 0], inplace=True)
Das sollte auch funktionieren:
w.female[w.female == 'female'] = 1
w.female[w.female == 'male'] = 0
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.
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.
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)
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.