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

如何在Python中自定义实现基于指定步长的条件累计频率计算?

实现基于步长值的累计频率计算

核心逻辑

你需要的不是修改cumsum(),而是针对每个C列的步长值,筛选出A列中小于等于该步长值的所有行,再对对应的B列频率求和——这本质是条件求和,而非传统的顺序累积求和。

方法一:Pandas 快速实现(适合结构化数据)

假设你的数据存储在Pandas DataFrame中,列名分别为A(价格)、B(频率)、C(步长),可以用apply直接实现需求:

import pandas as pd

# 示例测试数据
data = {
    'A': [1, 3, 5, 7, 9],
    'B': [0.1, 0.2, 0.3, 0.2, 0.2],
    'C': [0, 2, 4, 6, 8]
}
df = pd.DataFrame(data)

# 计算D列:对每个C值,累加所有A<=C的B列值
df['D'] = df['C'].apply(lambda x: df[df['A'] <= x]['B'].sum())

方法二:纯Python自定义函数(无依赖灵活实现)

如果不需要Pandas,直接用原生Python处理列表也能实现:

def calc_cumulative_freq(A_list, B_list, C_list):
    D_result = []
    for current_c in C_list:
        total = 0.0
        for a_val, b_val in zip(A_list, B_list):
            if a_val <= current_c:
                total += b_val
        D_result.append(total)
    return D_result

# 调用示例
A = [1, 3, 5, 7, 9]
B = [0.1, 0.2, 0.3, 0.2, 0.2]
C = [0, 2, 4, 6, 8]
D = calc_cumulative_freq(A, B, C)
# 输出结果:[0.0, 0.1, 0.3, 0.6, 0.8]

性能优化(大数据量场景)

如果你的数据量很大,上述方法可能效率偏低,可以用Numpy广播提升速度:

import numpy as np

A_np = np.array(df['A'])
B_np = np.array(df['B'])
C_np = np.array(df['C'])

# 生成A<=C的布尔矩阵,每行对应一个C值,每列对应一个A值
mask = A_np <= C_np[:, np.newaxis]
# 按行求和得到D列
df['D'] = mask.dot(B_np)

逻辑验证

拿示例数据核对:

  • C=0时,无A值满足条件,D=0.0
  • C=2时,仅A=1满足,累加B=0.1,D=0.1
  • C=4时,A=1、3满足,累加B=0.1+0.2=0.3
  • 后续步长以此类推,完全匹配Excel的计算逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:10:32