2017-07-28 9 views
2

私はパンダを使ってピボットテーブルの値を集計しています。パンダのマルチレベルpivot_tableでnlargestを使用するには?

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 

私は少し周りググてきましたし、私は望む結果を生み出すことができずに、異なる方法でnlargest()を使って試しました。誰もがアイデアを持っていますか?

答えて

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 
+0

ありがとうああ!それはうまくいった! –

+0

うれしい助けてよかった週末! – jezrael

関連する問題