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

基于Pandas实现两文件多列匹配并为Excel文件添加匹配标记列(Python新手求助)

问题:如何在Pandas中匹配两个文件的指定列并为匹配行添加标记?

我是Python新手,现在需要实现这样的需求:对比两个文件中的记录,找出匹配项。其中File1是Excel文件,列数比File2(CSV文件)多。我需要将File1的Source-a、Source-b、Target-1、Target-2这4列的值,与File2的对应4列进行匹配,当某行的这4列值完全匹配时,为File1的该行新增一列并标记为True。

我已经写了如下代码:

import pandas as pd
import numpy as np
from io import StringIO
df1 = pd.read_csv('File2.csv', delimiter=';',encoding="utf-8")
df2 = pd.read_excel('File1.xlsx')
df_1 = pd.DataFrame(df1)
df_2 = pd.DataFrame(df2)
for index_xls, row_xls in df_2.iterrows():
    excel = row_xls['Source-a'],row_xls['Source-b'],row_xls['Target-1'],row_xls['Target-2']
    for index_csv, row_csv in df_1.iterrows():
        csv = row_csv['Source-a'],row_csv['Source-b'],row_csv['Target-1'],row_csv['Target-2']
        pgv = excel == csv
        if pgv == True:
            print(excel)

现在代码能正确打印出匹配的记录,但我不知道怎么把匹配标记添加到File1的对应行中,希望得到帮助。


回答

首先得说,你当前用的双重iterrows()循环虽然能工作,但效率真的很低——尤其是当你的文件行数多的时候,Pandas的核心优势就是向量化操作,我们可以用更高效的方法来实现这个需求。

下面给你两种可行的方案:

方案一:使用merge方法(推荐,逻辑清晰)

我们可以把File2的4个关键列作为匹配键,和File1做一次左连接,然后根据连接结果标记是否匹配:

import pandas as pd

# 读取文件
df_csv = pd.read_csv('File2.csv', delimiter=';', encoding="utf-8")
df_excel = pd.read_excel('File1.xlsx')

# 定义需要匹配的列名
match_cols = ['Source-a', 'Source-b', 'Target-1', 'Target-2']

# 给csv的匹配列加个临时标记,方便后续判断
df_csv['is_match'] = True

# 左连接两个数据框,只保留匹配列和标记列
merged_df = df_excel.merge(
    df_csv[match_cols + ['is_match']],
    on=match_cols,
    how='left'
)

# 把空值(未匹配的行)填充为False,并重命名列(可选)
merged_df['is_match'] = merged_df['is_match'].fillna(False)

# 保存结果到新的Excel文件
merged_df.to_excel('File1_with_matches.xlsx', index=False)

方案二:使用isin结合元组(更简洁)

我们可以把File2的4列转换成元组的集合,然后检查File1的每一行是否在这个集合里:

import pandas as pd

# 读取文件
df_csv = pd.read_csv('File2.csv', delimiter=';', encoding="utf-8")
df_excel = pd.read_excel('File1.xlsx')

# 定义需要匹配的列名
match_cols = ['Source-a', 'Source-b', 'Target-1', 'Target-2']

# 把csv的匹配列转换成元组的集合
csv_matches = set(df_csv[match_cols].apply(tuple, axis=1))

# 检查excel的每一行是否在集合中,新增标记列
df_excel['is_match'] = df_excel[match_cols].apply(tuple, axis=1).isin(csv_matches)

# 保存结果
df_excel.to_excel('File1_with_matches.xlsx', index=False)

如果一定要基于你的原代码修改(不推荐,效率低)

如果你想在自己的代码基础上调整,只需要先新增标记列,找到匹配时给对应行赋值就行:

import pandas as pd
import numpy as np

df1 = pd.read_csv('File2.csv', delimiter=';',encoding="utf-8")
df2 = pd.read_excel('File1.xlsx')

# 先新增标记列,默认设为False
df2['is_match'] = False

match_cols = ['Source-a', 'Source-b', 'Target-1', 'Target-2']

for index_xls, row_xls in df2.iterrows():
    excel_tuple = tuple(row_xls[match_cols])
    # 遍历csv的行,找到匹配就标记为True并跳出循环
    for _, row_csv in df1.iterrows():
        csv_tuple = tuple(row_csv[match_cols])
        if excel_tuple == csv_tuple:
            df2.loc[index_xls, 'is_match'] = True
            break  # 找到匹配就不用继续遍历了

# 保存结果
df2.to_excel('File1_with_matches.xlsx', index=False)

但还是强烈建议用前两种向量化的方法,尤其是数据量大的时候,速度会快很多!

内容的提问来源于stack exchange,提问作者densing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:24:06