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

nzkunb0c  于 2023-05-21  发布在  其他
关注(0)|答案(3)|浏览(99)

假设我有以下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
42fyovps

42fyovps1#

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

#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

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

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
nkoocmlb

nkoocmlb2#

我强烈推荐使用sklearnhttps://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html
在安装了one hot编码器之后,您可以查看访问<your_fitted_instance_name>.categories_属性的类别,并且它还具有inverse_transform()功能来反转one hot编码!
至于列下降。默认值是不丢弃任何内容。但是,您可以使用OneHotEncoder(drop='first')来删除一个。

编辑:还要注意的是,sklearn提供了Pipelines,可以帮助您在整个项目中确保一致的预处理!https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html

8ulbf1ek

8ulbf1ek3#

你可以

pd.get_dummies(, drop_first = False)

然后手动删除您不需要的级别:

df.drop('dum_b_z', axis = 1, inplace = True)

相关问题