按熊猫分组的加权平均列

jta*_*man 5 python numpy pandas

因此,我在Pandas DataFrame中有两个值列和两个权重列,我想生成第三列,该列是按这两列的加权平均值进行分组的。

因此对于:

df = pd.DataFrame({'category':['a','a','b','b'],
  'var1':np.random.randint(0,100,4),
  'var2':np.random.randint(0,100,4),
  'weights1':np.random.random(4),
  'weights2':np.random.random(4)})
df
  category  var1  var2  weights1  weights2
0        a    84    45  0.955234  0.729862
1        a    49     5  0.225470  0.159662
2        b    77    95  0.957212  0.991960
3        b    27    65  0.491877  0.195680
Run Code Online (Sandbox Code Playgroud)

我想完成:

df
  category  var1  var2  weights1  weights2    average
0        a    84    45  0.955234  0.729862  67.108023
1        a    49     5  0.225470  0.159662  30.759124
2        b    77    95  0.957212  0.991960  86.160443
3        b    27    65  0.491877  0.195680  37.814851
Run Code Online (Sandbox Code Playgroud)

我已经使用像这样的算术运算符完成了此操作:

df['average'] = df.groupby('category', group_keys=False) \
  .apply(lambda g: (g.weights1 * g.var1 + g.weights2 * g.var2) / (g.weights1 + g.weights2))
Run Code Online (Sandbox Code Playgroud)

但是我想将其概括为使用numpy.average,因此我可以例如采用3列或更多列的加权平均值。

我正在尝试类似的方法,但是它似乎不起作用:

df['average'] = df.groupby('category', group_keys=False) \
  .apply(lambda g: np.average([g.var1, g.var2], axis=0, weights=[g.weights1, g.weights2]))
Run Code Online (Sandbox Code Playgroud)

返回

TypeError: incompatible index of inserted column with frame index
Run Code Online (Sandbox Code Playgroud)

有人可以帮我吗?

WeN*_*Ben 4

我什至认为你不需要groupby这里。apply请注意,这与+ 的输出相匹配lambda

尝试这个:

col=df.drop('category',1)
s=col.groupby(col.columns.str.findall(r'\d+').str[0],axis=1).prod().sum(1)
s/df.filter(like='weight').sum(1)
Out[33]: 
0    67.108014
1    30.759168
2    86.160444
3    37.814871
dtype: float64
Run Code Online (Sandbox Code Playgroud)