我有一列的分类值为[0 1 2 3 4 5]。我想通过以下方式仅用[1 2 3 4]替换这些值:
1 -> 1
2 -> 2
3 -> 3
0,4,5 -> 3
excel分类地图
我尝试了以下代码:
bins = [0, 1, 2, 3, 4, np.inf]
names = ['4','1','2','3','4']
data['NEW_EDU'] = pd.cut(data['EDU'], bins, labels=names)
但是我得到- ValueError:分类类别必须是唯一的
答案 0 :(得分:4)
您只需要使用isin()
df.loc[df['EDU'].isin([0,4,5])] = 3
示例:
df = pd.DataFrame({
'EDU': [1,2,3,4,5,0,4,2]
})
输出:
EDU
0 1
1 2
2 3
3 4
4 5
5 0
6 4
7 2
使用
df.loc[df['EDU'].isin([0,4,5])] = 3
输出:
EDU
0 1
1 2
2 3
3 3
4 3
5 3
6 3
7 2
答案 1 :(得分:1)
使用lambda表达式的另一种方法:
df['NEW_EDU'] = df['EDU'].apply(lambda x: 3 if x in [0, 4, 5] else x)
或使用numpy.where:
import numpy as np
df['NEW_EDU'] = np.where(df["EDU"].isin([0, 4, 5]), 3, df["EDU"])
如果按照@rafaelc的建议,将列保持为分类类型很重要:
df['NEW_EDU'] = pd.Categorical(np.where(df["EDU"].isin([0, 4, 5]), 3, df["EDU"]))
答案 2 :(得分:0)
使用字典将新值映射到键:
value_dict = {1:1, 2:2, 3:3, 0:4, 4:4, 5:4}
然后遍历该列,并将键替换为映射值。
df['NEW_EDU'] = [value_dict[x] for x in df['EDU']]
这使您可以在值列表之间创建任意映射