Lassen Sie uns zunächst ein mcve erstellen, mit dem Sie spielen können:
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
Jetzt können wir pd.get_dummies verwenden , um die ersten drei Spalten zu codieren.
Beachten Sie, dass ich den drop_first
Parameter verwende, da N-1
Dummies ausreichen, um die N
Möglichkeiten vollständig zu beschreiben (z. B. wenn a_Var2
und a_Var3
0 sind, dann ist es a_Var1
). Außerdem spezifiziere ich speziell die Spalten, muss dies aber nicht, da es sich entweder um Spalten mit dtype object
oder categorical
(weiter unten) handelt.
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
In Ihrer spezifischen Anwendung müssen Sie eine Liste der Spalten bereitstellen, die kategorisch sind, oder Sie müssen ableiten, welche Spalten kategorisch sind.
Im besten Fall hat Ihr Datenrahmen diese Spalten bereits mit einem dtype=category
und Sie können columns=df.columns[df.dtypes == 'category']
an übergeben get_dummies
.
Andernfalls schlage ich vor, die dtype
Anzahl aller anderen Spalten entsprechend festzulegen (Hinweis: pd.to_numeric, pd.to_datetime usw.), und es object
verbleiben Spalten mit einem d- Typ, die Ihre kategorialen Spalten sein sollten.
Die Parameterspalten pd.get_dummies lauten standardmäßig wie folgt:
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.