Answers:
如果您的分类列当前是字符/对象,则可以使用类似的方法来做每一件事:
char_cols = df.dtypes.pipe(lambda x: x[x == 'object']).index
for c in char_cols:
df[c] = pd.factorize(df[c])[0]
如果您需要返回类别,我将创建一个字典来保存编码;就像是:
char_cols = df.dtypes.pipe(lambda x: x[x == 'object']).index
label_mapping = {}
for c in char_cols:
df[c], label_mapping[c] = pd.factorize(df[c])
使用Julien的mcve将输出:
In [3]: print(df)
Out[3]:
a b c d
0 0 0 0 0.155463
1 1 1 1 0.496427
2 0 0 2 0.168625
3 2 0 1 0.209681
4 0 2 1 0.661857
In [4]: print(label_mapping)
Out[4]:
{'a': Index(['Var2', 'Var3', 'Var1'], dtype='object'),
'b': Index(['Var2', 'Var1', 'Var3'], dtype='object'),
'c': Index(['Var3', 'Var2', 'Var1'], dtype='object')}
object
列的代码非常有用。
首先,让我们创建一个mcve来玩:
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
现在我们可以使用pd.get_dummies编码前三列。
请注意,我使用该drop_first
参数是因为N-1
虚拟变量足以完全描述N
可能性(例如:如果a_Var2
and a_Var3
为0,则为a_Var1
)。另外,我专门指定了列,但我不必这样做,因为它将是dtype object
或categorical
(更多内容见下文)。
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
在您的特定应用程序中,您将必须提供一个列为“分类”的列表,或者您必须推断哪些列为“分类”。
最好的情况是您的数据框已经包含带有a的列,dtype=category
您可以将其传递columns=df.columns[df.dtypes == 'category']
给get_dummies
。
否则,我建议dtype
适当设置所有其他列的(提示:pd.to_numeric,pd.to_datetime等),您将剩下带有dtype的列,object
这些列应该是您的分类列。
pd.get_dummies参数列的默认值如下:
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.