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())
额外代码问题提醒
- 原代码中
if块和else块重复编写了to_reserve的计算逻辑,完全可以抽出来统一处理,减少冗余。 - 原代码里
reserved在if块内初始化,容易引发局部变量未定义的风险,提前在循环外初始化更安全。
内容的提问来源于stack exchange,提问作者Dario de Jong
相关产品推荐
相关产品推荐

