将加权平均函数应用于数据框而不对其进行分组,就好像它是一个单独的组一样

Apply a weighted average function to a dataframe without grouping it, as if it was a single group

我想应用一个函数来计算类似于 所有 我的数据框元素的加权平均绝对偏差。

我已经有了一个解决方案,但它对我来说似乎很古怪,因为我必须使用 groupby 和一个始终 returns 相同值的 lambda 函数:

def mdft(group):
    d = np.abs(my_target - group['column1'])
    w = group['weight_column']
    return (d * w).sum() / w.sum()
df.groupby(lambda x: True).apply(mdft)

如果我不使用 groupby,pandas 会将此函数应用于数据帧的每一行,这不是我的目标。

是否可以在没有 groupby 的情况下做同样的事情?

一些示例数据:

import numpy as np
import pandas as pd

my_target = 25
df = pd.DataFrame({'column1': np.random.normal(25, 3, 20),
                   'weight_column': np.random.random_integers(1, 10, 20)})

df
Out[4]: 
      column1  weight_column
0   23.147356              6
1   24.361162              5
2   25.665186              4
3   20.059039              1
4   28.573390              5
5   26.543743              1
6   23.177928              2
# etc.

好的,所以在您的 post 中,当您说 "If I don't use groupby, pandas would apply this function to every row of the dataframe" 时,这不一定是正确的。您应该尝试阅读 numpy 数组的操作方式 "vectorized"。因此,就像人们在评论中指出的那样,您的功能无需执行 groupby 即可正常工作:

mdft(df)
Out[9]: 1.9429828309434094

就是说,您本来可以避免首先编写该函数,因为 numpy 可以为您进行加权:

np.average(np.abs(my_target - df['column1']), weights=df['weight_column'])
Out[8]: 1.9429828309434098