如何删除CSV中首列值存在于另一CSV首列的行?解决pandas KeyError问题
问题原因与解决方案
报错原因
你运行代码报KeyError: 'drop_key'的核心原因是两张表除连接键Genus外,存在FAGR、MOCA、MUBR等多个重名列,合并时列名冲突导致标记列drop_key没有被正确合并到结果中;也有可能是你在给df2添加drop_key后,后续操作意外覆盖了df2变量,导致标记列丢失。
更简洁的解决方案(推荐,适合学习索引逻辑)
不需要用merge关联,直接用pandas的isin方法筛选即可,代码逻辑更清晰易懂:
# 提取表2中所有需要剔除的Genus唯一值 to_drop = df2['Genus'].unique() # 筛选表1中Genus不在剔除列表中的行 result_df = df1[~df1['Genus'].isin(to_drop)]
其中~是pandas中的逻辑取反符号,刚好匹配你「保留不在表2首列中的行」的需求,运行后得到的result_df就是符合要求的结果。
原有代码的修复方案
如果你想沿用merge的逻辑,只需要合并时仅保留表2的连接键和标记列,避免重名列干扰即可:
df1 = generagrouped_df # 仅保留需要的列做合并标记,避免重名冲突 df2_mark = df2[['Genus']].copy() df2_mark['drop_key'] = 'DROP' output = pd.merge( left = df1, right = df2_mark, how = 'left', on = 'Genus' ) # 筛选未匹配到标记的行,同时删除多余的标记列 result_df = output[output['drop_key'].isna()].drop(columns=['drop_key'])
如果还有问题,可以在merge后执行print(output.columns.tolist())查看合并后的所有列名,确认标记列是否存在。
内容的提问来源于stack exchange,提问作者Nana_marinbio
相关产品推荐
相关产品推荐

