我有一个像这样的Pandas数据框:
Date Time Spent (seconds) Activity
0 2017-03-23T00:00:00 92 netflix.com
1 2017-03-23T00:05:00 158 netflix.com
2 2017-03-23T00:25:00 285 netflix.com
3 2017-03-23T00:30:00 5 netflix.com
4 2017-03-23T00:40:00 214 netflix.com
5 2017-03-23T00:45:00 300 netflix.com
6 2017-03-23T00:45:00 5 Google Calendar for Android
7 2017-03-23T00:45:00 3 Google Now
8 2017-03-23T00:45:00 1 LinkedIn - Android
9 2017-03-23T00:50:00 33 netflix.com
10 2017-03-23T01:10:00 167 netflix.com
当我在Series Activity上执行value_counts时,我得到以下内容:
WhatsApp Messenger Android 1111
netflix.com 881
mendeley desktop 756
sharelatex.com 722
Google Now 647
newtab 584
google.co.uk 501
microsoft word 449
我想用原始数据框中的系列活动替换计数/出现次数小于20的所有项目,并使用字符串'other'。
我已经考虑/尝试通过手动迭代数据框并替换它们来做到这一点,但我的数据帧有几万行,效率非常低。什么是更好的方法来实现这一目标?
答案 0 :(得分:4)
让我们使用groupby
和transform
:
df.assign(Activity=df.groupby('Activity')['Activity'].transform(lambda x: x if x.size>=20 else 'other'))
答案 1 :(得分:1)
df.loc[df.Activity.isin(vc.index[vc<20].values), 'Activity'] = 'other'
其中vc
是value_counts
答案 2 :(得分:0)
你可以使用非常快的 pd.Series.map :
VC = df['Activity'].value_counts()
df['Activity'] = df['Activity'].map(lambda p : p if VC[p]>20 else 'other')