如何在pandas中的多级pivot_table上使用nlargest?

时间:2017-07-28 06:00:07

标签: python pandas

我正在使用pandas汇总数据透视表中的值。

dfr = pd.DataFrame({'A':  [1,1,1,1,2,2,2,2], 
                    'B':  [1,2,2,3,1,2,2,2], 
                    'C':  [1,1,1,2,1,1,2,2], 
                    'Val':[1,1,1,1,1,1,1,1]})
dfr = dfr.pivot_table(values='Val', index=['A', 'B', 'C'], aggfunc=np.sum)
dfr

输出:

A   B   C   |Val
------------|---
1   1   1   |1
    2   1   |2
    3   2   |1
2   1   1   |1
    2   1   |1
        2   |2

我需要输出的方式是显示每个组A中的最大值,如下所示:

A   B   C   |Val
------------|---
1   2   1   |2
2   2   2   |2

我已经google了一下,尝试以不同的方式使用nlargest(),而无法产生我想要的结果。有人有任何想法吗?

1 个答案:

答案 0 :(得分:3)

我认为level A需要groupby + nlargest

dfr = dfr.pivot_table(values='Val', index=['A', 'B', 'C'], aggfunc=np.sum)
dfr = dfr.groupby(level='A')['Val'].nlargest(1).reset_index(level=0, drop=True).reset_index()
print (dfr)
   A  B  C  Val
0  1  2  1    2
1  2  2  2    2

因为如果使用pivot_table则会丢失其他级别:

dfr = dfr.pivot_table(values='Val', index=['A', 'B', 'C'], aggfunc=np.sum).reset_index()
dfr = dfr.pivot_table(values='Val', index='A', aggfunc=lambda x: x.nlargest(1))
print (dfr)
   Val
A     
1    2
2    2

如果使用所有级别,它会返回所有级别的nlrgest(不是你想要的)

dfr = dfr.pivot_table(values='Val', index=['A', 'B', 'C'], aggfunc=np.sum).reset_index()
dfr = dfr.pivot_table(values='Val', index=['A', 'B', 'C'], aggfunc=lambda x: x.nlargest(1))
print (dfr)
       Val
A B C     
1 1 1    1
  2 1    2
  3 2    1
2 1 1    1
  2 1    1
    2    2