首页 > 解决方案 > 使用 pandas GroupBy 进行聚合时设置 MultiIndex

问题描述

一些练习要求在应用聚合函数时向 df 列“添加辅助名称”。

给定以下DF:

stype = ['s1','s1','s1','s1',
    's2','s2','s2','s2']
dtype = ['d1','d1','d2','d2',
        'd1','d1','d2','d2']
qty = [2, 1.4, 7, 3, 
        4, 1, 2.0, 3]
df = pd.DataFrame({'s_type':stype,
                    'd_type':dtype,
                    'qty':qty})

当按前 2 列分组并应用这样的 agg 函数时

new_df=df.groupby(['s_type','d_type'],sort =  False).agg({'qty':'median'})

并打印(new_df)

我得到这个输出,注意 qty向上移动了一行(我认为这是正常行为),因为是应用 agg 函数的一列

               qty
s_type d_type     
s1     d1      1.7
       d2      5.0
s2     d1      2.5
       d2      2.5

问题会是

是否可以在标签/名称下设置辅助列名称qty?,以获得如下输出:

               qty
s_type d_type  Median   
s1     d1      1.7
       d2      5.0
s2     d1      2.5
       d2      2.5

另外为什么要qty上移 1 行?(我正在使用 Spyder,我也在 Anaconda/python 控制台中看到了这一点,不确定它是否像一个功能或 pandas 的正常行为)。

最后一个更新:如果您需要使用 sort_values,您将不得不为添加二级索引/名称的列使用元组,在应用聚合函数时几乎以相同的方式(见答案

new_df=new_df.sort_values([('qty','MEDIAN')])

因此,您可以按应用 agg 函数的列和我们添加索引的列对 DF 进行排序

                 qty
              MEDIAN
s_type d_type       
s1     d1        1.7
s2     d1        2.5
       d2        2.5
s1     d2        5.0

蟒蛇v3.6

熊猫 v0.23

谢谢你。

标签: pythonpython-3.xpandaspandas-groupby

解决方案


超级简单。将“中位数”作为内部列表传递agg

result = df.groupby(['s_type','d_type'], sort=False).agg({'qty': ['median']})
result
                 qty
              median
s_type d_type       
s1     d1        1.7
       d2        5.0
s2     d1        2.5
       d2        2.5

至于“为什么 qty 向上移动 1 行”,这意味着前两列实际上是输出中的索引。查询result.index会很明显:

result.index

MultiIndex(levels=[['s1', 's2'], ['d1', 'd2']],
           codes=[[0, 0, 1, 1], [0, 1, 0, 1]],
           names=['s_type', 'd_type'])

您可以as_index=False在调用 groupby 时指定,

df.groupby(['s_type','d_type'], sort=False, as_index=False).agg({'qty': ['median']})

  s_type d_type    qty
                median
0     s1     d1    1.7
1     s1     d2    5.0
2     s2     d1    2.5
3     s2     d2    2.5

因此,groupers 仍然是输出中的列。


您可以通过将元组列表传递给来更改输出中的名称agg

df.groupby(['s_type','d_type'], sort=False).agg(
    {'qty': [('MEDIAN', 'median')]}
)

                 qty
              MEDIAN
s_type d_type       
s1     d1        1.7
       d2        5.0
s2     d1        2.5
       d2        2.5

推荐阅读