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

Python Pandas循环计算储备量时参数无法迭代传递求助

问题诊断与解决

核心问题:条件判断逻辑完全写反了

你的代码里,if i == 0 or df.loc[i]['SKU'] == df.loc[i-1]['SKU']这行逻辑搞反了。当前逻辑是:只要是第一行,或者当前行和上一行SKU相同,就把reserved重置为0——这直接导致同一SKU的每一行都无法继承上一次的reserved值,每次都从头开始计算,自然没法累积预留量。

正确逻辑应该是:当是第一行,或者当前行SKU和上一行不同(新SKU)时,才重置reserved为0,也就是把==改成!=。

修正后的基础版代码

import pandas as pd

df = pd.read_csv('test_file.csv')
final_reserve = []
reserved = 0  # 提前初始化,避免局部变量未定义风险

for i in range(len(df)):
    # 第一行或者新SKU,重置reserved
    if i == 0 or df.loc[i]['SKU'] != df.loc[i-1]['SKU']:
        reserved = 0
    
    # 统一计算逻辑,无需分if/else重复编写
    to_reserve = df.loc[i]['ON_HAND'] - (df.loc[i]['SALES'] * 2) - df.loc[i]['ALREADY_RESERVED'] - reserved
    final_reserve.append(to_reserve)
    reserved += to_reserve

df['to_reserve'] = final_reserve
print(df.head())

更符合Pandas风格的优化写法

用groupby按SKU分组处理,比循环更高效也更易维护:

import pandas as pd

df = pd.read_csv('test_file.csv')

def calculate_reserve(group):
    reserved = 0
    reserves = []
    for _, row in group.iterrows():
        to_reserve = row['ON_HAND'] - (row['SALES'] * 2) - row['ALREADY_RESERVED'] - reserved
        reserves.append(to_reserve)
        reserved += to_reserve
    group['to_reserve'] = reserves
    return group

# 按SKU分组计算预留量
df = df.groupby('SKU', group_keys=False).apply(calculate_reserve)
print(df.head())

额外代码问题提醒

  1. 原代码中if块和else块重复编写了to_reserve的计算逻辑,完全可以抽出来统一处理,减少冗余。
  2. 原代码里reserved在if块内初始化,容易引发局部变量未定义的风险,提前在循环外初始化更安全。

内容的提问来源于stack exchange,提问作者Dario de Jong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:21:37