pandas - columns - ¿Ejecutando get_dummies en varias columnas de DataFrame?
pandas get_dummies (4)
A menos que no entienda la pregunta, se admite de forma nativa en get_dummies al pasar el argumento de las columnas.
¿Cómo se puede ejecutar de forma idiomática una función como get_dummies
, que espera una sola columna y devuelve varias, en varias columnas de DataFrame?
Alguien puede tener algo más inteligente, pero aquí hay dos enfoques. Suponiendo que tiene un marco de datos llamado df
con las columnas ''Nombre'' y ''Año'' para las que desea dummies.
En primer lugar, simplemente iterar sobre las columnas no es tan malo:
In [93]: for column in [''Name'', ''Year'']:
...: dummies = pd.get_dummies(df[column])
...: df[dummies.columns] = dummies
Otra idea sería utilizar el paquete patsy , que está diseñado para construir matrices de datos a partir de fórmulas de tipo R.
In [94]: patsy.dmatrix('' ~ C(Name) + C(Year)'', df, return_type="dataframe")
Con pandas 0.19 , puedes hacer eso en una sola línea:
pd.get_dummies(data=df, columns=[''A'', ''B''])
Columns
especifica dónde se debe realizar la codificación Hot One.
>>> 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
Desde la versión 0.15.0 de pandas, pd.get_dummies
puede manejar un DataFrame directamente (antes de eso, solo podía manejar una sola Serie, y ver a continuación la solución):
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
Solución para pandas <0.15.0
Puedes hacerlo para cada columna por separado y luego concat los resultados:
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
Si no desea la columna de múltiples índices, elimine las keys=..
de la llamada a la función concat.