Wie kann man idiomatisch eine Funktion wie get_dummies
ausführen, die eine einzelne Spalte erwartet und mehrere auf mehreren DataFrame-Spalten zurückgibt?Ausführen von get_dummies auf mehreren DataFrame-Spalten?
Antwort
Seit Pandas Version 0.15.0, pd.get_dummies
kann einen Datenrahmen direkt verarbeiten (davor, es könnte nur eine einzige Serie handhaben, und unten für die Problemumgehung sehen):
In [1]: df = DataFrame({'A': ['a', 'b', 'a'], 'B': ['c', 'c', 'b'],
...: 'C': [1, 2, 3]})
In [2]: df
Out[2]:
A B C
0 a c 1
1 b c 2
2 a b 3
In [3]: pd.get_dummies(df)
Out[3]:
C A_a A_b B_b B_c
0 1 1 0 0 1
1 2 0 1 0 1
2 3 1 0 1 0
Behelfslösung für Pandas < 0.15.0
Sie können für jede Spalte seperate es tun und dann concat die Ergebnisse:
In [111]: df
Out[111]:
A B
0 a x
1 a y
2 b z
3 b x
4 c x
5 a y
6 b y
7 c z
In [112]: pd.concat([pd.get_dummies(df[col]) for col in df], axis=1, keys=df.columns)
Out[112]:
A B
a b c x y z
0 1 0 0 1 0 0
1 1 0 0 0 1 0
2 0 1 0 0 0 1
3 0 1 0 1 0 0
4 0 0 1 1 0 0
5 1 0 0 0 1 0
6 0 1 0 0 1 0
7 0 0 1 0 0 1
Wenn Sie die Multi-Index-Spalte nicht möchten, entfernen Sie die keys=..
aus dem Concat-Funktionsaufruf.
Schön, ich mag die Multi-Index-Spalte. – chrisb
Jemand könnte etwas schlauer haben, aber hier sind zwei Ansätze. Angenommen, Sie haben einen Datenrahmen mit dem Namen df
mit den Spalten 'Name' und 'Jahr', für den Sie Dummies verwenden möchten.
Zuerst einfach über die Spalten Iterieren ist nicht so schlecht:
In [93]: for column in ['Name', 'Year']:
...: dummies = pd.get_dummies(df[column])
...: df[dummies.columns] = dummies
Eine weitere Idee, das patsy Paket zu verwenden wäre, die entworfen, um Datenmatrizen von R-Typ Formeln zu konstruieren.
In [94]: patsy.dmatrix(' ~ C(Name) + C(Year)', df, return_type="dataframe")
Es sei denn, ich die Frage nicht verstehen, wird es, indem man die Spalten Argument nativ in get_dummies unterstützt.
Mit Pandas 0,19, können Sie, dass in einer einzigen Zeile tun:
pd.get_dummies(data=df, columns=['A', 'B'])
Columns
gibt an, wo die eine heiße Encoding zu tun.
>>> df
A B C
0 a c 1
1 b c 2
2 a b 3
>>> pd.get_dummies(data=df, columns=['A', 'B'])
C A_a A_b B_b B_c
0 1 1.0 0.0 0.0 1.0
1 2 0.0 1.0 0.0 1.0
2 3 1.0 0.0 1.0 0.0
Können Sie ein Beispiel geben? Welche Ausgabe haben Sie im Sinn? – joris