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

如何在Python中循环计算并生成DataFrame的Rollover结转值?

在Python DataFrame里生成Rollover列

规则拆解

Rollover是个逐日迭代计算的列,直白规则如下:

  1. 第一天:如果产量超过最大产能,Rollover就是超出的部分;没超就取0
  2. 后续每天:
    • 先算当日产量与产能的差值:产量超产能为正,产能富余为负
    • 当日Rollover = 前一日Rollover + 这个差值
    • 最终结果不能小于0,若计算值为负则直接取0

代码实现(两种方式)

假设你的DataFrame名为df,已按日期排序,包含production(产量)和max_capacity(最大产能)两列:

方式1:简单循环(适合小数据量)

import pandas as pd

# 确保数据按日期排序,未排序则执行此句
df = df.sort_values('date').reset_index(drop=True)

# 初始化Rollover列
df['Rollover'] = 0

# 处理第一天的初始值
first_diff = df.loc[0, 'production'] - df.loc[0, 'max_capacity']
df.loc[0, 'Rollover'] = max(first_diff, 0)

# 从第二天开始迭代计算
for i in range(1, len(df)):
    prev_roll = df.loc[i-1, 'Rollover']
    daily_diff = df.loc[i, 'production'] - df.loc[i, 'max_capacity']
    current_roll = prev_roll + daily_diff
    df.loc[i, 'Rollover'] = max(current_roll, 0)

方式2:高效迭代(适合大数据量)

循环在数据量大时效率偏低,可采用此方式:

import pandas as pd

df = df.sort_values('date').reset_index(drop=True)

# 计算每日产量与产能的差值
df['diff'] = df['production'] - df['max_capacity']

# 逐天计算Rollover,确保结果不小于0
rollover_list = []
current_roll = 0
for diff in df['diff']:
    current_roll = max(current_roll + diff, 0)
    rollover_list.append(current_roll)

df['Rollover'] = rollover_list
# 删除临时的差值列
df.drop('diff', axis=1, inplace=True)

示例验证

对应你提供的表格数据(示例数据如下):

日期产量最大产能
2024-01-01120100
2024-01-0290100
2024-01-03130100
2024-01-0480100

计算后Rollover列结果为:20, 10, 40, 20,完全符合规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 11:39:58