使用Python清洗Excel数据:含TH的ProductNumber行匹配填充代码无效如何修复
问题原因分析
你的代码没有生效是因为存在以下几处核心逻辑错误:
- 条件判断逻辑错误:
if "|TH" in dat['ProductNumber']是判断整个Series对象中是否存在指定字符串,而非判断当前遍历行的ProductNumber值包含TH,该条件永远不成立,后续代码块完全没有执行,因此无修改也无报错。 - 变量名冲突:三层循环重复使用
product作为变量名,外层遍历值被内层完全覆盖,逻辑混乱。 - 匹配规则不符合需求:原代码写的
test[j]==product[k]是对比两个字符串的单个字符,和你要求的「取ProductNumber左侧与Test值等长的部分匹配」规则完全不符。 - 列名拼写错误:需求中目标列名为
THNewHRequired,原代码中错误写为THNewHSKURequired,即使逻辑正确也不会修改目标列。 - 链式赋值风险:使用
dat['列名'][索引]的赋值方式属于pandas链式赋值,大概率不会生效,还会触发隐性警告。
正确实现方案
建议优先使用pandas自带的操作实现,避免多层嵌套循环,代码逻辑更清晰,执行效率更高:
import pandas as pd # 筛选所有ProductNumber包含TH的待处理行,记录原始索引 # 如果你需要匹配的是|TH,将下方的'TH'改为r'\|TH'即可 th_rows = dat[dat['ProductNumber'].str.contains('TH', na=False)].reset_index(names='original_idx') # 遍历每条待处理记录匹配规则 for _, row in th_rows.iterrows(): current_test = row['Test'] test_length = len(current_test) current_idx = row['original_idx'] # 匹配所有ProductNumber左侧等长部分和当前Test值相等的记录 matched = dat[dat['ProductNumber'].str[:test_length] == current_test] if not matched.empty: # 取第一条匹配记录的值,有多条匹配需求可自行调整取值规则 matched_row = matched.iloc[0] # 用loc赋值避免链式赋值问题 dat.loc[current_idx, 'PM'] = matched_row['PM'] dat.loc[current_idx, 'THRealignment'] = 'Yes' dat.loc[current_idx, 'THRecommendedRealignement'] = matched_row['H'] else: dat.loc[current_idx, 'THNewHRequired'] = 'Yes'
如果存在多条匹配结果,你可以根据自己的业务规则修改matched.iloc[0]部分的取值逻辑,比如取最新、取H值最大的记录等。
内容的提问来源于stack exchange,提问作者Nelly
相关产品推荐
相关产品推荐

