将加权平均函数应用于数据框而不对其进行分组,就好像它是一个单独的组一样
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
我想应用一个函数来计算类似于 所有 我的数据框元素的加权平均绝对偏差。
我已经有了一个解决方案,但它对我来说似乎很古怪,因为我必须使用 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