pandas 使用来自记录的权重和来自列名称的值的分组加权平均值
pandas grouped weighted average with weights from records and values from column names
我想计算一个分组加权平均值,其中权重以行的形式出现,要平均的值以列名称的形式出现:
df_dict= {1: {0: 10, 1: 15, 2: 50, 3: 10, 4: 44},
4: {0: 12, 1: 15, 2: 48, 3: 12, 4: 63},
7.5: {0: 17, 1: 23, 2: 99, 3: 20, 4: 66},
90: {0: 25, 1: 18, 2: 102, 3: 17, 4: 10},
'grouping': {0: '38', 1: '38', 2: '38', 3: '86', 4: '48'}}
df = pd.DataFrame(df_dict)
display(df)
df.groupby(['grouping']).sum().reset_index()
给出:
但我不确定如何有效地计算加权平均值。使用 numpy 可能是一种选择。但这意味着 df.apply
自定义函数没有得到很好的优化。
有没有更好的方法?
编辑
即有没有更好的晒黑方法:
df = df.groupby(['grouping']).sum().reset_index()
display(df)
def wavg(x):
values = x.drop('grouping')
values = values.reset_index()
values.columns = ['value', 'weight']
return np.average(list(values.value),
weights=list(values.weight))
df['wavg_location'] = df.apply(wavg, axis=1)
reset_index() 在这里不是必需的。
df_raw = df.groupby(['grouping']).sum()
我们可以在不调用 np.average()
的情况下进行加权求和
df = df_raw.copy()
df['wavg_location'] = (df * df.columns).sum(axis=1) / df.sum(axis=1)
我在 Jupyter notebook 中对两种不同的方法进行了计时:
for i in range(100):
df = df_raw.reset_index()
df['wavg_location'] = df.apply(wavg, axis=1)
在 712 毫秒内执行
for i in range(100):
df = df_raw.copy()
df['wavg_location'] = (df * df.columns).sum(axis=1) / df.sum(axis=1)
在 293 毫秒内执行
我想计算一个分组加权平均值,其中权重以行的形式出现,要平均的值以列名称的形式出现:
df_dict= {1: {0: 10, 1: 15, 2: 50, 3: 10, 4: 44},
4: {0: 12, 1: 15, 2: 48, 3: 12, 4: 63},
7.5: {0: 17, 1: 23, 2: 99, 3: 20, 4: 66},
90: {0: 25, 1: 18, 2: 102, 3: 17, 4: 10},
'grouping': {0: '38', 1: '38', 2: '38', 3: '86', 4: '48'}}
df = pd.DataFrame(df_dict)
display(df)
df.groupby(['grouping']).sum().reset_index()
给出:
但我不确定如何有效地计算加权平均值。使用 numpy df.apply
自定义函数没有得到很好的优化。
有没有更好的方法?
编辑
即有没有更好的晒黑方法:
df = df.groupby(['grouping']).sum().reset_index()
display(df)
def wavg(x):
values = x.drop('grouping')
values = values.reset_index()
values.columns = ['value', 'weight']
return np.average(list(values.value),
weights=list(values.weight))
df['wavg_location'] = df.apply(wavg, axis=1)
reset_index() 在这里不是必需的。
df_raw = df.groupby(['grouping']).sum()
我们可以在不调用 np.average()
的情况下进行加权求和df = df_raw.copy()
df['wavg_location'] = (df * df.columns).sum(axis=1) / df.sum(axis=1)
我在 Jupyter notebook 中对两种不同的方法进行了计时:
for i in range(100):
df = df_raw.reset_index()
df['wavg_location'] = df.apply(wavg, axis=1)
在 712 毫秒内执行
for i in range(100):
df = df_raw.copy()
df['wavg_location'] = (df * df.columns).sum(axis=1) / df.sum(axis=1)
在 293 毫秒内执行