Python 更改数据帧中成员较少的组的值

Python 更改数据帧中成员较少的组的值,python,pandas,Python,Pandas,我有一个数据框,用它们的值表示不同的类。例如: df=pd.DataFrame( {'label':['a','a','b','a','b','b','a','c','c','d','e','c'], 'date':[1,2,3,4,3,7,12,18,11,2,5,3],'value':np.random.randn(12)}) 我想选择值_计数小于特定阈值的标签,然后将它们放入一个类中,即将它们标记为例如“零” 这是我的尝试: value_count=df.label.value_cou

我有一个数据框,用它们的值表示不同的类。例如:

df=pd.DataFrame(
 {'label':['a','a','b','a','b','b','a','c','c','d','e','c'],
'date':[1,2,3,4,3,7,12,18,11,2,5,3],'value':np.random.randn(12)})
我想选择值_计数小于特定阈值的标签,然后将它们放入一个类中,即将它们标记为例如“零”

这是我的尝试:

value_count=df.label.value_counts()
threshold = 3
for index in value_count[value_count.values<=threshold].index:
    df.label[df.label==index]='zero'
value\u count=df.label.value\u counts()
阈值=3

对于value\u count[value\u count.values中的索引,可以使用groupby.transform使值计数与原始索引对齐,然后将其用作布尔索引:

df.loc[df.groupby('label')['label'].transform('count') <= threshold, 'label'] = 'zero'

df
Out: 
    date label     value
0      1     a -0.587957
1      2     a  0.341551
2      3  zero  0.516933
3      4     a  0.234042
4      3  zero -0.206185
5      7  zero  0.840724
6     12     a -0.728868
7     18  zero  0.111260
8     11  zero -0.471337
9      2  zero  0.030803
10     5  zero  1.012638
11     3  zero -1.233750
df.loc[df.groupby('label')['label'].transform('count')

In [59]: df.loc[df['label'].isin(value_count[value_count.values<=threshold].index),
 'label'] = 'zero'

In [60]: df
Out[60]:
    date label     value
0      1     a -0.132887
1      2     a -1.306601
2      3  zero -1.431952
3      4     a  0.928743
4      3  zero  0.278955
5      7  zero  0.128430
6     12     a  0.200825
7     18  zero -0.560548
8     11  zero -2.925706
9      2  zero -0.061373
10     5  zero -0.632036
11     3  zero -1.061894

In[59]:df.loc[df['label'].isin(value\u count[value\u count.valuesUhm,我已经更新了基准,我的是相反的。但是,我喜欢你的解决方案。:-@JohnGalt,别忘了“timeit”:
value\u count=df.label.value\u counts()
;)是的,现在有意义了。谢谢。
In [59]: df.loc[df['label'].isin(value_count[value_count.values<=threshold].index),
 'label'] = 'zero'

In [60]: df
Out[60]:
    date label     value
0      1     a -0.132887
1      2     a -1.306601
2      3  zero -1.431952
3      4     a  0.928743
4      3  zero  0.278955
5      7  zero  0.128430
6     12     a  0.200825
7     18  zero -0.560548
8     11  zero -2.925706
9      2  zero -0.061373
10     5  zero -0.632036
11     3  zero -1.061894
In [87]: df = pd.concat([df]*10**4, ignore_index=True)

In [88]: %timeit df['label'].isin(value_count[value_count.values<=threshold].index)
100 loops, best of 3: 7.1 ms per loop

In [89]: %timeit df.groupby('label')['label'].transform('count') <= threshold
100 loops, best of 3: 11.7 ms per loop

In [90]: df.shape
Out[90]: (120000, 3)