You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 23:45:40