遍历DataFrame时如何判断当前SKU列值是否存在于之前的行中
问题根因
代码不生效主要来自两个典型的pandas使用误区:
in运算符作用于Series对象时,默认校验的是元素是否在Series的索引列表中,而非Series的取值列表,这是最核心的错误原因- 切片范围不符合预期:pandas位置切片遵循左闭右开规则,你写的
df['SKU'][:i-1]无法覆盖所有前i-1行,要取索引0到i-1的所有前置行,切片应该写为df['SKU'][:i]
遍历写法的修复方案
如果必须保留遍历逻辑,修改为如下代码即可正常运行:
if df['SKU'].iloc[i] not in df['SKU'].iloc[:i].values:
修改说明:
- 用
.iloc明确按位置取值,避免DataFrame自定义索引时的取值错误 - 追加
.values将前置行的SKU列转为numpy数组,此时in运算符会正常校验元素是否在取值列表中 - 切片调整为
.iloc[:i],刚好覆盖当前行之前的所有行
更优的无遍历实现(推荐)
你要实现的SKU重复校验需求,pandas有内置方法可以直接完成,完全不需要循环遍历,性能远高于手动遍历:
# 新增标记列:值为True代表当前SKU在之前的行已经出现过,False代表首次出现 df['sku_is_duplicated'] = df['SKU'].duplicated()
后续要判断当前行SKU是否首次出现,直接取标记列的反值即可:
if not df['sku_is_duplicated'].iloc[i]: # 你的业务逻辑
内容的提问来源于stack exchange,提问作者Gustavo Moreno
相关产品推荐
相关产品推荐

