【问题标题】:Set MultiIndex when aggregating using pandas GroupBy使用 pandas GroupBy 进行聚合时设置 MultiIndex
【发布时间】:2019-06-11 14:59:54
【问题描述】:

一些练习要求在应用聚合函数时向 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 label/name 下设置辅助列名称?,以获得如下输出:

               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')])

所以你得到的 DF 按应用了 agg 函数的列和我们添加索引的列排序

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

python v3.6

熊猫 v0.23

谢谢。

【问题讨论】:

    标签: python python-3.x pandas pandas-groupby


    【解决方案1】:

    超级简单。在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 行”,这意味着前两列实际上是输出中的 index。查询result.index会很明显:​​

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

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

    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
    

    所以分组器在输出中保持列。


    您可以通过将元组列表传递给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
    

    【讨论】:

      猜你喜欢
      • 2019-06-16
      • 2020-06-29
      • 1970-01-01
      • 2018-03-01
      • 2023-03-25
      • 2021-04-04
      • 2017-04-06
      • 2018-10-28
      • 2014-11-23
      相关资源
      最近更新 更多