Pandas Groupby 只取前 N 个组 [重复]

Posted

技术标签:

【中文标题】Pandas Groupby 只取前 N 个组 [重复]【英文标题】:Pandas Groupy take only the first N Groups [duplicate] 【发布时间】:2015-10-17 18:55:41 【问题描述】:

我有一些要按 ID 分组的 DataFrame,例如。 g.:

import pandas as pd
df = pd.DataFrame('item_id': ['a', 'a', 'b', 'b', 'b', 'c', 'd'], 'user_id': [1,2,1,1,3,1,5])
print df

生成:

  item_id  user_id
0       a        1
1       a        2
2       b        1
3       b        1
4       b        3
5       c        1
6       d        5

[7 rows x 2 columns]

我可以轻松地按 id 分组:

grouped = df.groupby("item_id")

但是我怎样才能只返回前 N 个分组对象呢?例如。我只想要前 3 个唯一的 item_id。

【问题讨论】:

先过滤df不是更容易吗? df[df['item_id'].isin(df['item_id'].unique()[:3])].groupby('item_id')? @firelynx 我同意。我没有找到那个结果 迭代前 3 个组。for n,(k,gg) in enumerate(list(g)[:3]) 其中 g 是 groupby 的一个实例。 【参考方案1】:

这是使用list(grouped) 的一种方式。

result = [g[1] for g in list(grouped)[:3]]

# 1st
result[0]

  item_id  user_id
0       a        1
1       a        2

# 2nd
result[1]

  item_id  user_id
2       b        1
3       b        1
4       b        3

【讨论】:

谢谢,这是个好主意。由于一些限制,最后使用了随机查询。 当您只需要前 3 个组时,这会实例化列表中的所有组,因此对于大型 DataFrames 来说效率极低。【参考方案2】:

一种方法是使用Counter 从列表中获取前 3 个唯一项,根据这些项过滤您的 DataFrame,然后对这个过滤后的 DataFrame 执行 groupby 操作。

from collections import Counter

c = Counter(df.item_id)
most_common = [item for item, _ in c.most_common(3)]

>>> df[df.item_id.isin(most_common)].groupby('item_id').sum()
         user_id
item_id         
a              3
b              5
c              1

【讨论】:

谢谢,这是个好主意。由于一些限制,最后使用了随机查询。

以上是关于Pandas Groupby 只取前 N 个组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

mysql分组取前N记录

从 pandas groupby 对象中选择多个组

Pandas Groupby 值范围

键入时显示值,但只取前 6 个数字,并更改数字的顺序

mysql使用GROUP BY分组实现取前N条记录的方法

逻辑矩阵的 Pandas Groupby 条形图