Python对比CSV文件求交集遇MergeError,附可视化需求求助
解决CSV合并MergeError并实现交集提取与可视化
报错原因及修复方案
你遇到的MergeError大概率是因为**name_id列的匹配存在问题**,比如列名/值带空格、数据类型不匹配,或是未明确指定合并键。下面是修复后的完整代码:
import pandas as pd # 读取文件,处理CSV中逗号后带空格的情况,同时清洗列名和值的空格 file1 = pd.read_csv('old_file.csv', sep=',\s*', engine='python') file1['name_id'] = file1['name_id'].str.strip() file2 = pd.read_csv('best_choice_file.csv') file2['name_id'] = file2['name_id'].str.strip() # 明确指定合并键为name_id,取交集(inner join) common_rows = pd.merge(file1, file2, on='name_id', how='inner') print("共同数据行:") print(common_rows) # 可选:将结果保存到新CSV common_rows.to_csv('common_concentrations.csv', index=False)
关键修复点:
- 用
sep=',\s*'和engine='python'解析CSV中逗号后带任意空格的格式,避免列名读取错误 - 用
str.strip()去除name_id值的前后空格,解决因空格导致的匹配失败 - 明确指定
on='name_id'和how='inner',替代默认合并逻辑,避免歧义
浓度数据可视化
提取到共同数据后,可通过以下代码做可视化对比:
import matplotlib.pyplot as plt # 柱状图:对比每个样本的两个测试浓度 plt.figure(figsize=(12, 6)) x = range(len(common_rows)) width = 0.35 plt.bar([i - width/2 for i in x], common_rows['conc_test1'], width, label='conc_test1') plt.bar([i + width/2 for i in x], common_rows['conc_test2'], width, label='conc_test2') plt.xticks(x, common_rows['name_id'], rotation=45, ha='right') plt.title('优选样本浓度测试对比') plt.xlabel('样本ID') plt.ylabel('浓度值') plt.legend() plt.tight_layout() plt.show() # 箱线图:查看两个测试浓度的整体分布 plt.figure(figsize=(8, 6)) common_rows[['conc_test1', 'conc_test2']].boxplot() plt.title('优选样本浓度分布') plt.ylabel('浓度值') plt.show()
额外排查项
如果仍报错,检查以下内容:
- 确认两个文件的
name_id列名完全一致(注意大小写、特殊字符) - 检查
name_id列是否有空值,可通过以下代码去除缺失行:file1 = file1.dropna(subset=['name_id']) file2 = file2.dropna(subset=['name_id'])
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

