Python for循环内替换DataFrame Invalid值代码失效问题
代码错误原因
你修改后的代码无法正常运行,核心问题有3个:
- 替换对象搞反:需要替换
Invalid值的是入参dx(即DataFrame1),不是参考表dref(DataFrame2),原逻辑判断dref_data == 'Invalid'完全颠倒了操作主体 - 条件判断语法错误:
dref_data是numpy数组类型,直接和字符串'Invalid'做等值比较会返回布尔数组,放在if条件中会触发numpy/pandas的真值歧义报错 - 缩进逻辑错误:后续的字段比对代码被错误缩进,只有满足前面错误的if条件才会执行,逻辑链路断裂
正确实现代码
提前对参考表按Product去重取第一条匹配值,避免循环中重复筛选数据提升效率,循环内先完成Invalid值替换,再执行原有比对逻辑:
import pandas as pd def compareFrames(dx: pd.DataFrame, dref: pd.DataFrame) -> list: rslt = [] print(dx.shape[0]) # 预处理参考表:每个Product仅保留第一条匹配记录,减少循环内重复计算 ref_map = dref.groupby('Product', as_index=False).first() for i in range(dx.shape[0]): current_row = dx.iloc[i].copy() current_prod = current_row['Product'] ref_row = ref_map[ref_map['Product'] == current_prod].iloc[0] # 逐列检查替换Invalid值 for col in ['Color', 'Brand']: if current_row[col] == 'Invalid': current_row[col] = ref_row[col] # 若需要直接修改原DataFrame1中的Invalid值,取消下一行注释即可 # dx.loc[i, col] = ref_row[col] # 执行原有一致性比对 if current_row['Color'] == ref_row['Color'] and current_row['Brand'] == ref_row['Brand']: rslt.append('OK') else: rslt.append('Not OK') return rslt
运行效果
传入你提供的两份测试数据执行函数:
- 第0行(Product A)原Color为
Invalid,替换为参考值Red后与参考行完全一致,标记为OK - 第1行(Product B)原Brand为
Invalid,替换为参考值CK后与参考行完全一致,标记为OK - 第2行(Product C)无
Invalid值,字段与参考行完全匹配,标记为OK
最终返回结果为['OK', 'OK', 'OK'],如果开启原表修改的注释代码,DataFrame1中所有Invalid值会被直接替换为参考表的对应正确值。
内容的提问来源于stack exchange,提问作者Naiara Tabanez
相关产品推荐
相关产品推荐

