引用 groupby 结果的聚合列

Referencing aggregate column of a groupby result

我有一个这样的数据框:

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

现在聚合索引 table 我遇到了这个错误:

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

KeyError: "Columns not found: 'count'"

dfindx.columns 

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

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

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

NameError: name 'inventory' is not defined

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

TypeError: list indices must be integers or slices, not str

我认为您可以通过 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 输出中使用您的代码,请在下一次聚合中为 select 使用元组:

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

作为这些对象的方法存在的许多 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