2017-10-12 195 views
2

グループの合計の%を示す列を計算するにはどうすればよいですか?それを行うには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() 

はしかし、私の実際のデータに私はより多くの列を持っている、と私は思います合計の直後に%が必要なので、この方法では列の順序を手動で変更する必要があります。

%を合計の直後の列にするためのより直接的な方法はありますか?私のグループのすべてのグループでは、異なる集計関数を異なる列(xの合計と平均、yの最小値など)に適用するため、agg()などが必要であることに注意してください。

ありがとうございます!

答えて

1

私は%replace列名、あなたがagglambda functionが必要だと思うし、:

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

ありがとう!ラムダ関数を使ってgroupbyの加重平均を計算することはできますか? –

+1

うーん、 'agg'に[this](https://stackoverflow.com/q/26205922/2901002)解決策を実装する必要がありますか? – jezrael

+0

私はあなたが列名の%でラムダを置き換える参照してください。しかし、同じ列に対して複数のラムダ関数があるとどうなりますか?例えば。列bの場合、Iはsum(b)および%を、次にcount(b)および関連%を行うことができます。名前を変更するためにネストされた辞書を使用することは正直なところ、理由があるので、列の名前を変更する方法はありますか? https://stackoverflow.com/questions/46694207/applying-different-aggregate-functions-to-different-columns-now-that-dict-with –