You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas GroupBy对象上应用自定义函数计算加权平均

解决方案

方法1:结合自定义func函数实现

你可以通过groupby('bird_type')按鸟类分组,然后对每个分组应用自定义逻辑,调用你的func函数计算加权平均,同时汇总观测鸟类数量的总和:

def process_group(group):
    return pd.Series({
        'avg_speed': func(group['avg_speed'], group['no_of_birds_observed']),
        'no_of_birds_observed': group['no_of_birds_observed'].sum(),
        'reliability_of_data': func(group['reliability_of_data'], group['no_of_birds_observed'])
    })

# 应用分组处理逻辑
result = df.groupby('bird_type').apply(process_group).reset_index()

运行后就能得到你预期的结构,process_group函数负责对每个分组的子DataFrame做计算:分别调用func处理两个目标列,同时计算观测数量的总和。


方法2:更高效的向量化实现(推荐)

你的func使用了循环,数据量大时效率偏低,推荐用Pandas向量化操作直接计算加权平均,避免循环开销:

result = df.groupby('bird_type').apply(
    lambda g: pd.Series({
        'avg_speed': (g['avg_speed'] * g['no_of_birds_observed']).sum() / g['no_of_birds_observed'].sum(),
        'no_of_birds_observed': g['no_of_birds_observed'].sum(),
        'reliability_of_data': (g['reliability_of_data'] * g['no_of_birds_observed']).sum() / g['no_of_birds_observed'].sum()
    })
).reset_index()

这种方式利用Pandas的内置运算优化,比循环写法快得多,尤其是在处理大规模数据集时。


验证结果

以你提供的示例数据为例,运行上述代码后会得到:

bird_type  avg_speed  no_of_birds_observed  reliability_of_data
0     crane  158.533333                    15              0.482081
1    falcon  132.500000                    10              0.576258

和你预期的计算结果完全一致。

内容的提问来源于stack exchange,提问作者berinaniesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:50:29