2016-07-25 95 views
1

我有一个数据框,我想通过两个变量进行分组,然后在这些变量内执行计算。有没有简单的方法来做到这一点,BACK把信息转换成数据帧时,我做了,即是这样的:使用groupby对Pandas DataFrame进行计算,然后将其传递回DataFrame?

df=pd.DataFrame({'A':[1,1,1,2,2,2,30,12,122,345], 
'B':[1,1,1,2,3,3,3,2,3,4], 
'C':[101,230,12,122,345,23,943,83,923,10]}) 

total = [] 
avg = [] 
AID = [] 
BID = [] 
for name, group in df.groupby(['A', 'B']): 
    total.append(group.C.sum()) 
    avg.append(group.C.sum()/group.C.nunique()) 
    AID.append(name[0]) 
    BID.append(name[1]) 

x = pd.DataFrame({'total':total,'avg':avg,'AID':AID,'BID':BID}) 

但显然更有效?

回答

2

可以groupby后使用pandas聚合函数:

import pandas as pd 
import numpy as np 
df.groupby(['A', 'B'])['C'].agg({'total': np.sum, 'avg': np.mean}).reset_index() 

#  A B total   avg 
# 0 1 1  343 114.333333 
# 1 2 2  122 122.000000 
# 2 2 3  368 184.000000 
# 3 12 2  83 83.000000 
# 4 30 3  943 943.000000 
# 5 122 3  923 923.000000 
# 6 345 4  10 10.000000 
+0

我觉得这就是答案,但我有一个问题 - 让我们说,“平均”是真正的总和()以独特的分另一列中的元素 - 我将如何参考另一列。 np.sum/np.unique(组[ 'other_column'])?那有意义吗? – user1566200

+0

我可能会分两步做。 'df1 = df.groupby(['A','B'])['C']。agg({'total':np.sum}); df1 ['avg'] = df1.total /df.groupby(['A','B'])['other']。agg({'num':pd.Series.nunique})。num; df1.reset_index()'这样的事情; – Psidom