我的数据是这样的:
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
请任何人帮助我解决此问题。
谢谢。
答案 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