如何在python

时间:2018-08-22 12:22:57

标签: python pandas pandas-groupby

我的数据是这样的:

x1  x2  var1  var2
0   1   1     1 
0   0   2     2
0   0   1     3
1   0   3     3

我定义了一个计算加权均值的函数-

def W_M(x,w):
    y1=w.div(w.sum())
    m=x*y1.div(y1.sum())
    m=m.sum()
    return(m)

在这里,我想计算var1的W_M,并在按“ by”对象分组的数据中使用var2作为权重。

by=['x1','x2']
df.groupby(by,as_index=False).agg({var1: lambda x: x.W_M(var1,var2)})

我不知道上面的分组代码是否正确..但是我试过了。

我想要的输出如下所示:

x1 x2 var1 var2
0   1   1     1
0   0   1     5
1   0   1     3

请任何人帮助我解决此问题。

谢谢。

2 个答案:

答案 0 :(得分:1)

感谢上帝,经过这么多尝试,终于得到了解决方案。 下面我提到了用于生成预期输出的代码。

out=data.groupby(['x1','x2'],as_index=False).apply(lambda x: np.average(x['var1'], 
weights=x['var2']))
bn=pd.DataFrame(out)
bn.reset_index(inplace=True)
bn=bn.rename(columns={0:'var1'})
result = pd.merge(bn,
                  data[['x1','x2','var2']],
                  on=['x1','x2'], 
                  how='left')

答案 1 :(得分:0)

使用np.average和新列DataFrame.join

s = data.groupby(['x1','x2']).apply(lambda x: np.average(x['var1'], weights=x['var2']))
print (s)
x1  x2
0   0     1.4
    1     1.0
1   0     3.0
dtype: float64

result = data.drop('var1', axis=1).join(s.rename('var1'), on=['x1','x2'])
#if necessary change ordering of columns
result = result[['x1','x2','var1','var2']]
print (result)
   x1  x2  var1  var2
0   0   1   1.0     1
1   0   0   1.4     2
2   0   0   1.4     3
3   1   0   3.0     3