我希望捕获一些分类值,这些值的出现频率高于某个特定阈值:
但是这将产生以下结果:
什么是最优雅/性能最佳的解决方案?
df:
ticket_id, category, amount --> some more columns
1020 cat1 1000
1022 cat1 55
1023 cat1 12291
1120 cat2 140
1121 cat3 1250
^
|
|
Way more rows with mostly (1020) cat5, (98) cat1, cat3, cat4 and no cat2.
>>>> df.groupby('category')['amount'].count()
category
cat1 100
cat2 1
cat3 6
cat4 2
cat5 1020
我希望能够把数量大于20的分类列出来。目前我的做法是:
>>>> t = test.groupby('disposition')['fine_amount'].agg(['count','mean'])
>>>> t[t['count']>10].index.values
array(['cat1','cat5'])
现在这样可以工作,但我相信可以更简短地完成:为了引用计数列
,我需要至少2个聚合函数,此外还需要1个变量和2行代码。
我希望可以有以下简洁的写法:
>>>> groupby('category')['amount'].apply(lambda x: x.count() > 10)
但是这将产生以下结果:
cat1 100 True
etc
>>>> groupby('category')['amount'].apply(lambda x: x[x.count() > 10])
Fails completely
>>>> groupby('category')['amount'].count().nlargest(2)
gives the correct list but in this case because I know there are 2 elements.
什么是最优雅/性能最佳的解决方案?
new_df = new_df.groupby(["col1", "col2"]).filter(lambda x: len(x) >= 10_000)
,但我不知道这是否是一个好答案。使用len
进行计数可能不是最佳解决方案。 - Robert P. Goldman