决定要放入哪个类别 pandas get_dummies()

Decide which category to drop in pandas get_dummies()

假设我有以下 df:

data = [{'c1':a, 'c2':x}, {'c1':b,'c2':y}, {'c1':c,'c2':z}]
df = pd.DataFrame(data)

Output:

       c1 c2
    0  a  x
    1  b  y
    2  c  z

现在我想使用 pd.get_dummies() 对两个分类列 c1 和 c2 进行一次热编码,并删除每个列的第一个类别 pd.get_dummies(df, columns = ['c1', 'c2'], drop_first=True)。在不知道行的顺序的情况下,如何决定删除哪个类别?我错过了什么命令吗?


编辑: 所以我的目标是,例如,从 c1 中删除类别 b,从 c2

中删除 z
Output:

       a  c  x  y
    0  1  0  1  0
    1  0  0  0  1
    2  0  1  0  0

我强烈建议改用 sklearnhttps://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html

装上一热编码器后可以查看访问<your_fitted_instance_name>.categories_属性的分类,并且还有inverse_transform()反转一热编码的功能!

至于删除列..默认是不删除任何内容。但是,您可以使用 OneHotEncoder(drop='first') 来删除一个。

编辑:另请注意,sklearn 提供的管道可以帮助您确保整个项目的预处理一致! https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html

一个技巧是将值替换为 NaNs - 这里每行删除一个值:

#columns with values for avoid
d = {'c1':'b', 'c2':'z'}

d1 = {k:{v: np.nan} for k, v in d.items()}
df = pd.get_dummies(df.replace(d1), columns = ['c1', 'c2'], prefix='', prefix_sep='')
print (df)
   a  c  x  y
0  1  0  1  0
1  0  0  0  1
2  0  1  0  0

如果每列需要删除多个值,请使用如下列表:

d = {'c1':['b','c'], 'c2':['z']}

d1 = {k:{x: np.nan for x in v} for k, v in d.items()}
print (d1)
{'c1': {'b': nan, 'c': nan}, 'c2': {'z': nan}}

df = pd.get_dummies(df.replace(d1), columns = ['c1', 'c2'], prefix='', prefix_sep='')
print (df)
   a  x  y
0  1  1  0
1  0  0  1
2  0  0  0

编辑:

如果每列的值是唯一的,则更简单的是在最后一步中删除它们:

df = (pd.get_dummies(df, columns = ['c1', 'c2'], prefix='', prefix_sep='')
        .drop(['b','z'], axis=1))
print (df)
   a  c  x  y
0  1  0  1  0
1  0  0  0  1
2  0  1  0  0