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

如何计算加权循环?基于Pandas数据帧的分箱加权平均实现

IBI分箱加权平均计算实现

问题背景

给定以下数据帧:

import pandas as pd

df = pd.DataFrame({
    'IBI_msec': [652, 618, 654],
    'rate': [92.02, 97.09, 91.74]
})

需要实现分箱计算逻辑:

  • 若某行IBI_msec > 500,当前分箱值bins取该行rate,剩余时长(IBI_msec - 500)计入下一个分箱
  • 后续分箱需用上一行剩余时长与当前行的部分时长凑够500毫秒,分箱值为两者的加权平均:(剩余时长×上一行rate + 所需时长×当前行rate)/500
  • 注:数据中不会出现IBI_msec小于500的情况

期望最终输出:

IBI_msec    rate   bins
0      652   92.02  92.02
1      618   97.09  95.55
2      654   91.74  94.63

循环实现方案

# 初始化剩余时长变量和分箱结果列表
remaining_ibi = 0
bins_results = []

for idx, row in df.iterrows():
    current_ibi = row['IBI_msec']
    current_rate = row['rate']
    
    if remaining_ibi > 0:
        # 计算当前分箱需要从该行取的时长
        required_ibi = 500 - remaining_ibi
        # 计算加权平均分箱值
        bin_value = (remaining_ibi * df.loc[idx-1, 'rate'] + required_ibi * current_rate) / 500
        bins_results.append(round(bin_value, 2))
        # 更新剩余时长:当前IBI减去已使用的部分
        remaining_ibi = current_ibi - required_ibi
    else:
        # 无剩余时长,直接取当前rate作为分箱值
        bins_results.append(current_rate)
        # 计算当前行剩余的IBI时长
        remaining_ibi = current_ibi - 500

# 将分箱结果添加到原数据帧
df['bins'] = bins_results
print(df)

代码说明

  • remaining_ibi用于存储上一行未耗尽的IBI时长,初始值为0
  • 遍历数据帧每一行时:
    • 若存在剩余时长,先计算需要从当前行提取的时长以凑够500毫秒,通过加权平均得到当前分箱值,再更新剩余时长
    • 若无剩余时长,直接将当前行的rate作为分箱值,同时计算当前行使用500毫秒后剩余的时长
  • 最后将分箱值保留两位小数后添加到原数据帧,输出结果与预期一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:45:40