Pandas合并df后删除‘Presunto Responsable’列值为‘Desconocido’的行无效
代码问题排查与修复
核心问题点
dropData函数逻辑冗余+执行错误- 原代码中
for c in indexNames:下的data.drop(...)存在缩进错误,若实际运行时代码未正确缩进会直接触发语法报错;即便缩进正确,循环完全多余:DataFrame.drop()本身支持直接传入整组索引批量删除,循环执行N次删除属于冗余操作,还会因重复删除已不存在的索引触发KeyError。 - 若使用
inplace=True修改原数据,无需写循环逻辑,一行代码即可完成批量过滤。
- 原代码中
- 字符串匹配的隐性偏差
- 直接用
== 'Desconocido'判断取值,容易漏删带前后空格、全半角字符差异的匹配值(比如单元格实际存储为" Desconocido "、带特殊引号的“Desconocido”这类情况),导致判断不生效。
- 直接用
- 合并逻辑的对齐风险
- 你使用
left_index=True, right_index=True按行索引合并两个表,若两个源Excel表的行号和实际业务数据不一一对应(比如表A有100行、表B只有90行,或两表行顺序错位),合并后Presunto Responsable列的内容会和其他列错位,导致过滤时匹配错误。 - 若两个表本身存在重复的
Presunto Responsable列,你用data_B.columns.difference(data_A.columns)的逻辑会直接跳过表B的同名列,若实际需要过滤的列来自表B,会导致目标列不存在或取值不全。
- 你使用
修复后的可运行代码
#%% Get data def getData(path_A, path_B): dfv = pd.read_excel(path_A) dfc = pd.read_excel(path_B) return dfv, dfc #%% merge dataframes def mergeData(data_A, data_B): # 若两个表需要按业务主键合并,可将下一行替换为on='你的主键列名',避免按行号错位 cols_to_use = data_B.columns.difference(data_A.columns) data = pd.merge(data_A, data_B[cols_to_use], left_index=True, right_index=True, how='outer') # 将'Presunto Responsable'列移到表尾 cols_at_end = ['Presunto Responsable'] data = data[[c for c in data if c not in cols_at_end] + [c for c in cols_at_end if c in data]] return data #%% Drop 'Desconocido' values in 'Presunto Responsable' def dropData(data): # 批量过滤,兼容前后空格、空值场景,无需循环 data = data[~data['Presunto Responsable'].astype(str).str.strip().eq('Desconocido')] return data
额外排查提示
- 若仍存在漏删情况,可先执行
print(data['Presunto Responsable'].unique())查看该列所有实际取值,确认待过滤值的准确文本。 - 合并操作完成后可先打印前5行数据,确认列对齐没有错位,再执行过滤操作。
内容的提问来源于stack exchange,提问作者user15379440
相关产品推荐
相关产品推荐

