2017-10-12 257 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 –