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

基于区间在Pandas DataFrame中计算加权均值的实现方法

在Pandas中高效计算区间加权平均的方案

这个需求在区间类数据分析里挺常见的,用Pandas完全可以通过矢量化操作高效实现,不用写繁琐的逐行循环。我给你一步步拆解实现步骤,还附了示例验证:

1. 先构造示例数据

首先我们把你给出的示例DataFrame构造出来,方便后续测试:

import pandas as pd

# 构造df1
df1 = pd.DataFrame({
    'id': [1,1,1,2,2,2],
    'start': [0,15,30,0,15,30],
    'end': [15,30,45,15,30,45]
})

# 构造df2
df2 = pd.DataFrame({
    'id': [1,1,1,1,2,2,2],
    'start': [0,1.1,11.4,34,0,1.5,20],
    'end': [1.1,11.4,34,46,1.5,20,30],
    'quantity': [3.5,5.5,2.5,3,2.2,1.0,4.5]
})

2. 核心实现步骤

整个过程都是Pandas的矢量化操作,效率很高,适合大数据量场景:

# 第一步:按id合并两个DataFrame,得到所有同id的行组合
merged = df1.merge(df2, on='id', suffixes=('_df1', '_df2'))

# 第二步:计算每对组合的重叠区间的起始和结束时间
merged['overlap_start'] = merged[['start_df1', 'start_df2']].max(axis=1)
merged['overlap_end'] = merged[['end_df1', 'end_df2']].min(axis=1)

# 第三步:筛选出真正有重叠的行(重叠起始时间小于结束时间)
merged = merged[merged['overlap_start'] < merged['overlap_end']]

# 第四步:计算重叠时长、权重,以及加权后的quantity值
merged['overlap_duration'] = merged['overlap_end'] - merged['overlap_start']
merged['weight'] = merged['overlap_duration'] / 15  # df1的区间长度固定为15
merged['weighted_quantity'] = merged['quantity'] * merged['weight']

# 第五步:按df1的原始行分组,求和得到最终的加权平均值
df1['quantity_average'] = merged.groupby(['id', 'start_df1', 'end_df1'])['weighted_quantity'].sum().reset_index(drop=True)

# 第六步:给没有任何重叠的行填充0值
df1['quantity_average'] = df1['quantity_average'].fillna(0)

3. 验证结果

运行完上面的代码后,df1的quantity_average列就会和你给出的示例结果完全一致:

id  start  end  quantity_average
0   1      0   15          4.633333
1   1     15   30          2.500000
2   1     30   45          0.666667
3   2      0   15          1.120000
4   2     15   30          3.333333
5   2     30   45          0.000000

为什么这个方法高效?

整个过程没有用Python层面的循环,全部是Pandas内部优化的矢量化操作:

  • 合并和筛选都是基于底层的C实现,比逐行处理快几个数量级
  • 分组求和也是Pandas的核心优化操作,能轻松处理十万甚至百万级别的数据

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

相关产品推荐
方舟 Agent Plan

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

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