如何在Python中循环计算并生成DataFrame的Rollover结转值?
在Python DataFrame里生成Rollover列
规则拆解
Rollover是个逐日迭代计算的列,直白规则如下:
- 第一天:如果产量超过最大产能,Rollover就是超出的部分;没超就取0
- 后续每天:
- 先算当日产量与产能的差值:产量超产能为正,产能富余为负
- 当日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-01 | 120 | 100 |
| 2024-01-02 | 90 | 100 |
| 2024-01-03 | 130 | 100 |
| 2024-01-04 | 80 | 100 |
计算后Rollover列结果为:20, 10, 40, 20,完全符合规则。
内容的提问来源于stack exchange,提问作者ayyyran
相关产品推荐
相关产品推荐

