如何用Python/Pandas合并两个CSV文件并保留所有行列及匹配指定字段
解决方案
核心问题:匹配字段格式不统一
你的问题根源在于匹配字段的格式不一致,比如示例中左表的SITE是KROTZ SPRINGS(全大写),右表是Krotz Springs(首字母大写),导致pandas.merge()无法识别为同一匹配项,从而产生NaN。此外还可能存在字段前后空格、数据类型差异等隐性问题。
解决步骤
1. 预处理匹配字段,统一格式
对两个数据框的CORPORATION、COMPANY_NAME、STATE_NAME、SITE、PADD字段做标准化处理:
- 转换为统一大小写(比如全大写)
- 去除字段值前后的冗余空格
- 统一数据类型(比如将
PADD转为字符串,避免数字与字符串类型不匹配)
2. 执行合并操作
预处理完成后,再调用merge方法,根据需求选择how参数:
- 仅保留两边匹配成功的记录:
how='inner' - 保留左表所有记录+右表匹配到的记录:
how='left' - 保留左右表所有记录(含未匹配项):
how='outer'
完整代码示例
import pandas as pd # 加载数据 refcap = pd.read_csv('../refcap22_trimmed.csv') eia2019 = pd.read_csv('../Petroleum_Refineries2019EIA.csv') # 定义需要标准化的匹配字段 match_cols = ['CORPORATION', 'COMPANY_NAME', 'STATE_NAME', 'SITE', 'PADD'] # 预处理左表匹配字段 for col in match_cols: refcap[col] = refcap[col].str.strip().str.upper() # 统一PADD字段为字符串类型 if col == 'PADD': refcap[col] = refcap[col].astype(str) # 预处理右表匹配字段 for col in match_cols: eia2019[col] = eia2019[col].str.strip().str.upper() if col == 'PADD': eia2019[col] = eia2019[col].astype(str) # 执行合并,保留所有列,基于预处理后的匹配字段 # 若仅需匹配成功的记录,将how改为'inner' output = pd.merge(refcap, eia2019, on=match_cols, how='outer') # 保存结果 output.to_csv('../output.csv', index=False) # 查看第一条匹配结果 print(output.iloc[0])
额外排查项
如果仍存在NaN,可以进一步检查:
- 匹配字段是否存在拼写差异(比如公司名称的简称/全称区别)
- 导出两边匹配字段的唯一值,对比是否有无法统一的特殊内容
- 若涉及周期/日期类字段,确认是否需要加入匹配条件
内容的提问来源于stack exchange,提问作者bkleeman
相关产品推荐
相关产品推荐

