如何用另一个分类变量列表替换不同的分类变量

时间:2019-09-13 19:03:41

标签: python pandas

我有一列的分类值为[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:分类类别必须是唯一的

3 个答案:

答案 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']]

这使您可以在值列表之间创建任意映射