pandas groupby&count上的过滤器

2024-06-28 19:02:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我想捕获发生率高于某个阈值的某些类别值:

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的类别。目前我在做:

^{pr2}$

现在这是可行的,但我相信它可以做得更短:为了引用count column,我需要至少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.

什么是最优雅/最具执行力的解决方案?在


Tags: lambdadfmorecount类别amountapplygroupby
2条回答

您只需使用初始groupby的结果并对其进行索引,就可以使其更清晰:

设置

categories = ['cat1', 'cat2', 'cat3', 'cat4', 'cat5']
dct = {'categories': [random.choice(categories) for i in range(75)], 'amount': [random.randint(1, 10) for _ in range(75)]}
df = pd.DataFrame(dct)

groupbycount

^{pr2}$

整洁的索引:

s[s > 20].index.tolist()
['cat3']

您可以在布尔索引中使用lambda express:

借用@user2483203设置:

np.random.seed(123)
categories = ['cat1', 'cat2', 'cat3', 'cat4', 'cat5']
dct = {'categories': [np.random.choice(categories) for i in range(100)], 'amount': [np.random.randint(1, 10) for _ in range(100)]}
df = pd.DataFrame(dct)

使用value_counts和布尔索引:

^{pr2}$

输出:

['cat4', 'cat2']

相关问题 更多 >