如何保持分类变量的某些级别并将其保留为pandas数据框中的“其他”

时间:2014-12-16 23:00:18

标签: python python-2.7 python-3.x pandas dataframe

我有两个数据框,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]

1 个答案:

答案 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。更新。