引用groupby结果的聚合列

时间:2018-03-29 05:01:05

标签: python pandas indexing summary

我有一个像这样的数据框:

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:未定义名称'inventory'

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

TypeError:list indices必须是整数或切片,而不是str

2 个答案:

答案 0 :(得分:2)

我认为您可以通过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输出中使用你的代码,请在下一个聚合中使用tuple进行选择:

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

答案 1 :(得分: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