说我有以下数据框:

>>> df=pd.DataFrame({'category':['a','a','b','b'],
... 'var1':np.random.randint(0,100,4),
... 'var2':np.random.randint(0,100,4),
... 'weights':np.random.randint(0,10,4)})
>>> df
  category  var1  var2  weights
0        a    37    36        7
1        a    47    20        1
2        b    33     7        6
3        b    16     6        8

我可以这样计算“var1”的加权平均值:
>>> Grouped=df.groupby('category')
>>> GetWeightAvg=lambda g: np.average(g['var1'], weights=g['weights'])
>>> Grouped.apply(GetWeightAvg)
category
a    38.250000
b    23.285714
dtype: float64

但是我想知道是否有一种方法可以编写我的函数并将其应用到我的分组对象上,以便我可以在应用时指定要计算的列(或同时计算两者)。与其将'var1'写入我的函数中,我希望能够在应用该函数时进行指定。

就像我可以得到两个列的未加权平均值一样:
>>> Grouped[['var1','var2']].mean()
          var1  var2
category
a         42.0  28.0
b         24.5   6.5

我想知道是否有一种并行的方法来处理加权平均值。

最佳答案

您可以应用并返回两个平均值:

In [11]: g.apply(lambda x: pd.Series(np.average(x[["var1", "var2"]], weights=x["weights"], axis=0), ["var1", "var2"]))
Out[11]:
               var1       var2
category
a         38.250000  34.000000
b         23.285714   6.428571

您可以将此函数编写得更简洁一些:
In [21]: def weighted(x, cols, w="weights"):
             return pd.Series(np.average(x[cols], weights=x[w], axis=0), cols)

In [22]: g.apply(weighted, ["var1", "var2"])
Out[22]:
               var1       var2
category
a         38.250000  34.000000
b         23.285714   6.428571

关于python - 多个列的 Pandas 群加权平均值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33574908/

10-13 07:00