it-swarm.com.de

Get_dummies für mehrere DataFrame-Spalten ausführen?

Wie kann man eine Funktion wie get_dummies, Die eine einzelne Spalte erwartet und mehrere zurückgibt, auf mehreren DataFrame-Spalten idiomatisch ausführen?

28
Emre

Seit pandas version 0.15.0, pd.get_dummies kann einen DataFrame direkt verarbeiten (zuvor konnte nur eine einzelne Serie verarbeitet werden; die Problemumgehung finden Sie weiter unten):

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

Problemumgehung für pandas <0.15.0

Sie können es für jede Spalte einzeln machen und dann die Ergebnisse zusammenfassen:

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 das keys=.. aus dem concat Funktionsaufruf.

40
joris

Mit pandas 0.19 können Sie das in einer einzigen Zeile tun:

pd.get_dummies(data=df, columns=['A', 'B'])

Columns gibt an, wo die One-Hot-Codierung durchgeführt werden soll.

>>> 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
36
bold

Jemand mag etwas schlaueres haben, aber hier sind zwei Ansätze. Angenommen, Sie haben einen Datenrahmen mit dem Namen df mit den Spalten 'Name' und 'Jahr', für die Sie Dummies erstellen möchten.

Erstens ist es nicht so schlimm, einfach über die Spalten zu iterieren:

In [93]: for column in ['Name', 'Year']:
    ...:     dummies = pd.get_dummies(df[column])
    ...:     df[dummies.columns] = dummies

Eine andere Idee wäre, das patsy -Paket zu verwenden, mit dem Datenmatrizen aus R-Typ-Formeln erstellt werden.

In [94]: patsy.dmatrix(' ~ C(Name) + C(Year)', df, return_type="dataframe")
5
chrisb

Sofern ich die Frage nicht verstehe, wird sie von Haus aus in get_dummies durch Übergabe des Spalten-Arguments unterstützt.

1
sapo_cosmico