【问题标题】:Referencing aggregate column of a groupby result引用 groupby 结果的聚合列
【发布时间】:2018-03-29 05:01:05
【问题描述】:

我有一个这样的数据框:

testdf

  category  item  inventory  sold
0        A   Low        100    50
1        A  High        200    75
2        A   Med        130    20
3        A  Misc        435   150
4        A  High        130    65
5        A  Misc        120    88    
6        B  Misc        321   230    
7        B  High        453   450
8        B   Low        321   301
9        B   Low        122    80

我根据类别和项目对其进行分组

dfindx = testdf.groupby(['category','item']).agg({'inventory':['count','sum']})

dfindx

              inventory     
                  count  sum
category item               
A        High         2  330
         Low          1  100
         Med          1  130
         Misc         2  555
B        High         1  453
         Low          2  443
         Misc         1  321

现在在聚合索引表时,我遇到了这个错误:

dfindx.groupby(['category'])[['count']].sum()

KeyError:“未找到列:'count'”

dfindx.columns 

MultiIndex(levels=[['inventory'], ['count', 'sum']],
           labels=[[0, 0], [0, 1]])

我无法正确引用计数和总和来汇总分组表。

dfindx.groupby(['category'])[inventory['count']].sum()

NameError:名称“库存”未定义

dfindx.groupby(['category'])[['inventory']['count']].sum()

TypeError: 列表索引必须是整数或切片,而不是 str

【问题讨论】:

    标签: python pandas indexing summary


    【解决方案1】:

    我认为您可以通过 list 与列 inventory 聚合来简化第一次聚合:

    dfindx = testdf.groupby(['category','item'])['inventory'].agg(['count','sum'])
    print (dfindx)
                   count  sum
    category item            
    A        High      2  330
             Low       1  100
             Med       1  130
             Misc      2  555
    B        High      1  453
             Low       2  443
             Misc      1  321
    

    然后下一个聚合运行良好:

    print(dfindx.groupby(['category'])[['count']].sum())
              count
    category       
    A             6
    B             4
    

    但是,如果想将您的代码与MultiIndex 输出一起使用,请在下一个聚合中使用元组进行选择:

    dfindx = testdf.groupby(['category','item']).agg({'inventory':['count','sum']})
    print (dfindx)
                  inventory     
                      count  sum
    category item               
    A        High         2  330
             Low          1  100
             Med          1  130
             Misc         2  555
    B        High         1  453
             Low          2  443
             Misc         1  321
    
    print(dfindx.groupby(['category'])[[('inventory','count')]].sum())
             inventory
                 count
    category          
    A                6
    B                4
    

    【讨论】:

      【解决方案2】:

      作为这些对象的方法存在的许多 DataFrame 和 Series 聚合函数可以采用在该级别上执行聚合的 level 参数。我将展示几种管理 MultiIndex 的方法。

      另请注意,我交替使用 level=0level='category'

      选项 1

      dfindx[('inventory', 'count')].sum(level='category')
      
      category
      A    6
      B    4
      Name: (inventory, count), dtype: int64
      

      选项 2

      dfindx.inventory['count'].sum(level=0)
      
      category
      A    6
      B    4
      Name: (inventory, count), dtype: int64
      

      选项 3

      dfindx.loc[:, pd.IndexSlice[:, 'count']].sum(level='category')
      
               inventory
                   count
      category          
      A                6
      B                4
      

      选项 4

      dfindx.xs('count', axis=1, level=1, drop_level=False).sum(level=0)
      
               inventory
                   count
      category          
      A                6
      B                4
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-05
        • 1970-01-01
        • 1970-01-01
        • 2019-10-04
        • 2021-11-01
        • 2019-10-12
        • 2017-07-02
        • 2017-07-20
        相关资源
        最近更新 更多