我有两个数据框,d1和d2,两个都有相同的分类变量。但是,特定变量的类别可能不同。
例如,对于数据框d1中的变量v1,我们有以下类别或级别:“a”,“b”,“c”,“d”, “E” 对于相同的变量v1,在数据框d2中我们有级别:“a”,“b”,“c”
我想在数据帧d1中转换v1,使得只有与d2共同的级别保留,其余的重新标记为“其他”,即d1 [“v1”]应转换为:“a”, “b”,“c”,“other”,“other”
两个数据框都有超过400万个观测值,因此我正在寻找一种快速的方法来实现这一目标。
以下示例:
d1 = pd.DataFrame({"id": range(1, 11), "v1": ["a", "b", "c", "d", "e", "a", "e", "d", "a", "d"]})
d2 = pd.DataFrame({"id": range(1, 11), "v1": ["a", "b", "c", "a", "c", "b", "c", "a", "b", "a"]})
d1
id v1
0 1 a
1 2 b
2 3 c
3 4 d
4 5 e
5 6 a
6 7 e
7 8 d
8 9 a
9 10 d
[10 rows x 2 columns]
d2
id v1
0 1 a
1 2 b
2 3 c
3 4 a
4 5 c
5 6 b
6 7 c
7 8 a
8 9 b
9 10 a
[10 rows x 2 columns]
转换后,新的d1应如下所示:
d1
id v1
0 1 a
1 2 b
2 3 c
3 4 other
4 5 other
5 6 a
6 7 other
7 8 other
8 9 a
9 10 other
[10 rows x 2 columns]
答案 0 :(得分:3)
怎么样
d1.ix[~d1.v1.isin(d2.v1.unique()), 'v1'] = 'other'
编辑在反思中,解释也会很好。 :)
d2.v1.unique()
- 在d2.v1
d1.v1.isin()
- 在d1.v1
d1.ix[~..., 'v1']
- 反转,选择符合条件的行并更改这些行上的v1
列 编辑2 抱歉,我的原始答案将d1
中的两行都更改为other
。更新。