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 个组时,这会实例化列表中的所有组,因此对于大型DataFrame
s 来说效率极低。【参考方案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 个组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章