Primeiro, vamos criar um mcve para brincar:
import pandas as pd
import numpy as np
In [1]: categorical_array = np.random.choice(['Var1','Var2','Var3'],
size=(5,3), p=[0.25,0.5,0.25])
df = pd.DataFrame(categorical_array,
columns=map(lambda x:chr(97+x), range(categorical_array.shape[1])))
# Add another column that isn't categorical but float
df['d'] = np.random.rand(len(df))
print(df)
Out[1]:
a b c d
0 Var3 Var3 Var3 0.953153
1 Var1 Var2 Var1 0.924896
2 Var2 Var2 Var2 0.273205
3 Var2 Var1 Var3 0.459676
4 Var2 Var1 Var1 0.114358
Agora podemos usar o pd.get_dummies para codificar as três primeiras colunas.
Observe que estou usando o drop_first
parâmetro porque os N-1
manequins são suficientes para descrever completamente as N
possibilidades (por exemplo: se a_Var2
e a_Var3
são 0, então é a_Var1
). Além disso, estou especificando especificamente as colunas, mas não preciso, pois serão colunas com o tipo dtype object
ou categorical
(mais abaixo).
In [2]: df_encoded = pd.get_dummies(df, columns=['a','b', 'c'], drop_first=True)
print(df_encoded]
Out[2]:
d a_Var2 a_Var3 b_Var2 b_Var3 c_Var2 c_Var3
0 0.953153 0 1 0 1 0 1
1 0.924896 0 0 1 0 0 0
2 0.273205 1 0 1 0 1 0
3 0.459676 1 0 0 0 0 1
4 0.114358 1 0 0 0 0 0
Em seu aplicativo específico, você precisará fornecer uma lista de colunas que são categóricas ou inferir quais colunas são categóricas.
Na melhor das hipóteses, seu quadro de dados já possui essas colunas com dtype=category
e você pode passar columns=df.columns[df.dtypes == 'category']
para get_dummies
.
Caso contrário, sugiro definir as dtype
de todas as outras colunas conforme apropriado (dica: pd.to_numeric, pd.to_datetime, etc) e você ficará com colunas que possuem um object
dtype e essas devem ser suas colunas categóricas.
As colunas do parâmetro pd.get_dummies são padronizadas da seguinte maneira:
columns : list-like, default None
Column names in the DataFrame to be encoded.
If `columns` is None then all the columns with
`object` or `category` dtype will be converted.