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

如何在保留cumprod逻辑的同时实现DataFrame的Add列数值追加?

解决方案

问题背景

现有如下DataFrame:

data = {'Change': [.9, .8, .96, 1.5],
        'Add': [0, 0, 660, 0],
        'Open_Value':[1000, 900, 720, 691.2],
        'Close_Value':[900, 720, 691.2, 1036.8]} 

对应的表格:

Change  Add  Open_Value  Close_Value
0    0.90    0      1000.0        900.0
1    0.80    0       900.0        720.0
2    0.96  660       720.0        691.2
3    1.50    0       691.2       1036.8

需要实现逻辑:将Add列数值追加到当前行的Close_Value,同时该值作为下一行的Open_Value,最终期望得到(注:若按描述逻辑计算与示例数值有出入,以下方案按需求描述实现):

Change  Add  Open_Value  Close_Value
0    0.90    0        1000          900
1    0.80    0         900          720
2    0.96  660         720         1080
3    1.50    0        1080         1620

实现思路

由于每一行的Open_Value依赖上一行的Close_Value(含追加的Add值),属于带状态依赖的迭代计算,无法直接用cumprod实现(cumprod仅支持纯累积乘积操作),需用循环或itertools.accumulate逐行计算。

方法1:循环迭代计算

直接逐行推导,清晰直观:

import pandas as pd

data = {'Change': [.9, .8, .96, 1.5],
        'Add': [0, 0, 660, 0]}
df = pd.DataFrame(data)

# 初始化第一行的Open_Value
df.loc[0, 'Open_Value'] = 1000

for i in range(len(df)):
    # 计算当前行Close_Value:Open * Change + Add(追加Add到计算后的Close)
    df.loc[i, 'Close_Value'] = df.loc[i, 'Open_Value'] * df.loc[i, 'Change'] + df.loc[i, 'Add']
    # 非最后一行时,下一行的Open_Value等于当前行的Close_Value
    if i < len(df) - 1:
        df.loc[i+1, 'Open_Value'] = df.loc[i, 'Close_Value']

# 调整列顺序并格式化数值
df = df[['Change', 'Add', 'Open_Value', 'Close_Value']].astype(int)
print(df)

方法2:使用itertools.accumulate(更高效)

利用accumulate处理累积计算,适合大数据量场景:

import pandas as pd
from itertools import accumulate

data = {'Change': [.9, .8, .96, 1.5],
        'Add': [0, 0, 660, 0]}
df = pd.DataFrame(data)

# 定义累积计算逻辑:输入上一行的Close值,输出当前行的Close值
def calc_next_close(prev_close, row):
    current_open = prev_close
    return current_open * row['Change'] + row['Add']

# 生成Close_Value序列,初始值为第一行的Close计算结果
close_values = list(accumulate(df.itertuples(index=False), calc_next_close, initial=1000*df.iloc[0]['Change']+df.iloc[0]['Add']))
# Open_Value序列:第一个值为初始值1000,后续为前一行的Close值
open_values = [1000] + close_values[:-1]

# 赋值到DataFrame
df['Open_Value'] = open_values
df['Close_Value'] = close_values
df = df[['Change', 'Add', 'Open_Value', 'Close_Value']].astype(int)
print(df)

说明

若期望得到示例中的数值,需调整逻辑为Add追加到Open_Value后再计算Change,只需修改计算式为:

# 当前行Close_Value = (Open_Value + Add) * Change
df.loc[i, 'Close_Value'] = (df.loc[i, 'Open_Value'] + df.loc[i, 'Add']) * df.loc[i, 'Change']
# 下一行Open_Value = 当前行Close_Value

可根据实际业务需求调整计算逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:37:03