决定要放入哪个类别 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
我强烈建议改用 sklearn
! https://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
一个技巧是将值替换为 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
如果每列需要删除多个值,请使用如下列表:
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
假设我有以下 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
我强烈建议改用 sklearn
! https://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
一个技巧是将值替换为 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
如果每列需要删除多个值,请使用如下列表:
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