大熊猫按照记录的权重和列名称的值对加权平均值进行分组

时间:2019-08-27 13:42:34

标签: python pandas group-by weighted-average

我想计算一个分组的加权平均值,其中权重作为行出现,而要求平均值的值作为列名出现:

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()

给出: enter image description here

但是我不确定如何有效地计算加权平均值。可以使用numpy Weighted average using numpy.average。但这意味着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)

1 个答案:

答案 0 :(得分:0)

reset_index()在这里不是必需的。

const [nations, setNations] = React.useState<NationResource[]>([]);

const fetchNations = async () => {
    const loadedNations = await getNationsAsync();
    setNations(loadedNations);
};

React.useEffect(() => {
    fetchNations();
}, []);

我们可以执行加权总和而无需调用np.average()

useHook

我在Jupyter笔记本中计时了两种不同的方法:

useEffect

在712毫秒内执行

df_raw = df.groupby(['grouping']).sum()

在293毫秒内执行