Comment exécuter idiomatiquement une fonction comme get_dummies
, qui attend une seule colonne et en renvoie plusieurs, sur plusieurs colonnes DataFrame?
Depuis pandas version 0.15.0, pd.get_dummies
peut gérer un DataFrame directement (avant cela, il ne pouvait gérer qu'une seule série, et voir ci-dessous pour la solution):
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
Solution de contournement pour pandas <0.15.0
Vous pouvez le faire pour chaque colonne séparément, puis concaténer les résultats:
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 vous ne voulez pas de la colonne multi-index, supprimez le keys=..
à partir de l'appel de fonction concat.
Avec pandas 0.19, vous pouvez le faire sur une seule ligne:
pd.get_dummies(data=df, columns=['A', 'B'])
Columns
spécifie où faire le One Hot Encoding.
>>> 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
Quelqu'un peut avoir quelque chose de plus intelligent, mais voici deux approches. En supposant que vous ayez une trame de données nommée df
avec les colonnes 'Nom' et 'Année' pour lesquelles vous voulez des variables muettes.
Tout d'abord, simplement itérer sur les colonnes n'est pas trop mal:
In [93]: for column in ['Name', 'Year']:
...: dummies = pd.get_dummies(df[column])
...: df[dummies.columns] = dummies
Une autre idée serait d'utiliser le package patsy , qui est conçu pour construire des matrices de données à partir de formules de type R.
In [94]: patsy.dmatrix(' ~ C(Name) + C(Year)', df, return_type="dataframe")
Sauf si je ne comprends pas la question, elle est prise en charge nativement dans get_dummies en passant l'argument colonnes.