繁体   English   中英

Pandas groupby在保留多个聚合的组内进行排序

[英]Pandas groupby sort within groups retaining multiple aggregates

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

这是一个简单的例子:

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]

未分组的数据帧

我想按storeproduct ,都sumcountsales ,同时利用mean的的rating

这很简单:

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

分组

现在,我想只保留每组中排名前两位的行。 我能得到这个如下(使用有些直观的多层次扩展[我]咒语从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个平均评级,但组自身排序如此第一组评级最高,等等。在某种程度上,这只是锦上添花,因为我现在拥有我想要的价值,并希望报告更漂亮。

我把它分类了。 我不需要对分组表进行索引并执行上面的后续groupbysort_values ,而是需要将sort_values应用于未编入索引的DataFrame ,指定要显式排序的列:

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

给我想要的结果:

在此输入图像描述

这就是你如何使用sort_values + groupby + head -

dfg.sort_values(('rating', 'mean'), ascending=False)\
   .groupby(level=0)\
   .head(2)\
   .sort_index()

                 rating         sales      
                   mean           sum count
store product                              
bar   B        4.388521    636.813757     1
      C        3.931341   1843.772878     1
baz   A        2.501077  23110.162196     4
      B        3.339784  10610.257660     2
foo   B        2.785306  10315.968161     2
      D        2.160556  31084.181719     5

最后的sort_index调用排序索引无序问题(双关语意图)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM