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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:57:02