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

