2017-10-12 254 views
2

如何計算顯示groupby中總數百分比的列?pandas groupby:如何計算總數的百分比?

一種方式來做到這一點是在gorupby後手動計算的話,在這個例子中的最後一行:

import numpy as np 
import pandas as pd 
df= pd.DataFrame(np.random.randint(5,8,(10,4)), columns=['a','b','c','d']) 
g = df.groupby('a').agg({'b':['sum','mean'], 'c':['sum'], 'd':['sum']}) 
g.columns = g.columns.map('_'.join) 
g['b %']=g['b_sum']/g['b_sum'].sum() 

然而,在我真實的數據,我還有更多的列,而且我在求和之後需要%,所以用這種方法我不得不手動改變列的順序。

是否有一個更直接的方法來做到這一點,使得%是總和之後的列?請注意,我需要agg()或類似的東西,因爲在我所有的groupbys中,我將不同的聚合函數應用於不同的列(例如x的sum和avg,但只有y的最小值等)。

謝謝!

回答

1

我認爲你需要在agglambda function然後replace列名%

np.random.seed(78) 
df= pd.DataFrame(np.random.randint(5,8,(10,4)), columns=['a','b','c','d']) 

g =(df.groupby('a') 
     .agg({'b':['sum',lambda x: x.sum()/ df['b'].sum(),'mean'], 
      'c':['sum'], 
      'd':['sum']})) 
g.columns = g.columns.map('_'.join).str.replace('<lambda>','%') 

print (g) 

    d_sum c_sum b_sum  b_% b_mean 
a          
5  25  24  24 0.387097  6 
6  11  11  14 0.225806  7 
7  22  23  24 0.387097  6 
+0

謝謝!我可以使用lambda函數來計算groupby中的加權平均數嗎? –

+1

嗯,你需要實現[this](https://stackoverflow.com/q/26205922/2901002)解決方案到'agg'嗎? – jezrael

+0

我看到你在列名中用%替換lambda。但是如果我對同一列有多個lambda函數呢?例如。對於列b我可以做總和(b)和%,然後計算(b)和相關的%。現在我怎麼能重命名列,出於誠實地超越我的原因,使用嵌套字典進行重命名已被棄用? https://stackoverflow.com/questions/46694207/applying-different-aggregate-functions-to-different-columns-now-that-dict-with –