如何在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
相关产品推荐
相关产品推荐

