gpt4 book ai didi

python - Pandas groupby 在保留多个聚合的组内排序

转载 作者:太空宇宙 更新时间:2023-11-03 14:47:10 25 4
gpt4 key购买 nike

我想在 groupby 返回的组中应用排序和限制,如 this question .但是,我有多个聚合,我希望所有聚合都保留在结果中。

这是一个简单的例子:

products = ["A", "B", "C", "D"]
stores = ["foo", "bar", "baz"]
n = 30

product_list = [products[i] for i in np.random.randint(0, len(products), n)]
store_list = [stores[i] for i in np.random.randint(0, len(stores), n)]
rating_list = np.random.random(n) * 5
sales_list = np.random.random(n) * 10000

df = pd.DataFrame(
{'store': store_list,
'product': product_list,
'sales': sales_list,
'rating': rating_list})

df = df[['store', 'product', 'sales', 'rating']]

df[:5]

ungrouped dataframe

我想按 storeproduct 进行分组,sumcount sales ,同时采用 ratingmean

这很简单:

dfg = df.groupby(['store', 'product']).agg({'sales': ['sum', 'count'], 
'rating': 'mean'})

grouped

现在,我只想保留每个组中评分最高的两个行。我可以按如下方式得到它(使用来自 1 的有点不直观的 [对我来说] 咒语的多级扩展):

g = dfg[('rating', 'mean')].groupby(
level=0, group_keys=False).apply(
lambda x: x.sort_values(ascending=False).head(2))
g

这将返回以下 Series:

store  product
bar B 3.601135
A 1.867449
baz B 2.984196
D 2.780500
foo B 3.767912
D 3.129346
Name: (rating, mean), dtype: float64

但我丢失了 ('sales', 'sum')('sales', 'count') 列。

我怀疑我需要提取 g.index 并以某种方式使用它,但无法对其进行排序(双关语)。

编辑:下面的答案设法给出了我正在寻找的组,但我真正想要的是一个稳定的排序,我不仅在每个组中获得前 N 个平均评分,而且组本身进行排序,以便第一组具有最高评级等。在某种程度上,这只是锦上添花,因为我现在拥有我想要的值,并且希望报告更漂亮。

最佳答案

我已经整理好了。我需要将 sort_values 应用于未索引的 ,而不是像上面那样对分组表进行索引并执行后续的 groupbysort_values >DataFrame,明确指定要排序的列:

g = dfg.groupby(level=0, group_keys=False).apply(
lambda x: x.sort_values(('rating', 'mean'), ascending=False).head(2))

给我想要的结果:

enter image description here

关于python - Pandas groupby 在保留多个聚合的组内排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48393336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com