web-dev-qa-db-fra.com

Vous exécutez get_dummies sur plusieurs colonnes DataFrame?

Comment exécuter idiomatiquement une fonction comme get_dummies, qui attend une seule colonne et en renvoie plusieurs, sur plusieurs colonnes DataFrame?

28
Emre

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.

40
joris

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

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")
5
chrisb

Sauf si je ne comprends pas la question, elle est prise en charge nativement dans get_dummies en passant l'argument colonnes.

1
sapo_cosmico