如何有效地在“熊猫专栏”中创建“其他”类别?

时间:2019-01-12 14:20:05

标签: python python-3.x pandas

我有一个pandas.DataFrame,如下所示:

print(df)

level   type

'xyz'     1
'abc'     2
'abc'     4
'abc'     3
'xyz'     3
'qwe'     2
'asd'     5
'poi'     1

我想用新值level替换值计数小于2的others列中的所有值。

print(df['level'].value_counts())

abc    3
xyz    2
poi    1
qwe    1
asd    1

在上面的示例中,计数为1(即qwe, asd, poi的类别应替换为others

预期输出:

    level   type
0   xyz     1
1   abc     2
2   abc     4
3   abc     3
4   xyz     3
5   others  2
6   others  5
7   others  1

我尝试过的事情

cats = []
x = dict(df['level'].value_counts())
for k,v in x.items():
    if v > 1:
        cats.append(k)

df['level'] = [j if j in cats else 'others' for i,j in df['level'].iteritems()]

上面的代码生成预期的输出,但速度太慢。所以我在找 以获得更有效的解决方案。

1 个答案:

答案 0 :(得分:1)

使用isin和过滤后的索引值v创建布尔掩码,并通过loc设置值:

v = df['level'].value_counts() == 1
df.loc[df['level'].isin(v.index[v]), 'level'] = 'others'
print (df)
    level  type
0     xyz     1
1     abc     2
2     abc     4
3     abc     3
4     xyz     3
5  others     2
6  others     5
7  others     1

详细信息

print (v.index[v])
Index(['qwe', 'asd', 'poi'], dtype='object')