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

基于文件名匹配比较Pandas DataFrame与文本文件并拆分结果

问题描述

已有一个带表头的Pandas DataFrame,结构如下:

file    test1   test2   test3   test4
50001   6789999 1789999 89999   69999
50002   76      999     6999    6789
50003   1790001 67999   67999   9789999

同时有一个无表头的test.txt文件,列数与DataFrame一致,数据如下:

50001   6789999 1789999 89999   69999
50002   5790000 999     6999    6789
50003   1790001 67999   67999   9789999

需要以file列为匹配键,对比两者的所有列:

  • 所有列值都匹配的行写入Matched file.txt
  • 任意列不匹配的行(取DataFrame中的对应行)写入Unmatched file.txt

期望输出:
Matched file.txt

50001   6789999 1789999 89999   69999
50003   1790001 67999   67999   9789999

Unmatched file.txt

50002   76  999 6999    6789
解决思路

步骤1:统一读取数据源

  • 读取已有的Pandas DataFrame(假设变量名为df)
  • 读取test.txt时指定与DataFrame一致的列名,保证结构对齐

步骤2:按匹配键合并并对比列值

  • 以file列为键合并两个数据集,为两边的测试列添加后缀区分
  • 批量对比所有测试列的值是否完全一致,生成匹配标记

步骤3:拆分结果并写入文件

  • 根据匹配标记筛选出对应行,保留原DataFrame的内容格式
  • 分别写入匹配/不匹配文件,不保留表头,保持原始分隔符格式
代码实现
import pandas as pd

# 模拟已有DataFrame(实际使用时替换为你的数据源)
data = {
    'file': [50001, 50002, 50003],
    'test1': [6789999, 76, 1790001],
    'test2': [1789999, 999, 67999],
    'test3': [89999, 6999, 67999],
    'test4': [69999, 6789, 9789999]
}
df = pd.DataFrame(data)

# 读取test.txt,指定列名和分隔符(根据实际文件调整sep参数)
txt_df = pd.read_csv('test.txt', sep='\t', header=None, names=['file', 'test1', 'test2', 'test3', 'test4'])

# 按file列合并,添加后缀区分两个数据源的列
merged_df = df.merge(txt_df, on='file', suffixes=('_df', '_txt'), how='inner')

# 批量对比所有测试列,生成匹配标记
test_cols = ['test1', 'test2', 'test3', 'test4']
match_mask = merged_df[[f'{col}_df' for col in test_cols]].eq(merged_df[[f'{col}_txt' for col in test_cols]]).all(axis=1)

# 筛选匹配/不匹配的行
matched_rows = df[match_mask]
unmatched_rows = df[~match_mask]

# 写入文件,不保留表头和索引,保持原始分隔符
matched_rows.to_csv('Matched file.txt', sep='\t', index=False, header=False)
unmatched_rows.to_csv('Unmatched file.txt', sep='\t', index=False, header=False)

补充说明

  • 如果原始文件用空格分隔,将sep='\t'改为sep='\s+'匹配任意数量空格
  • 若需要保留仅单边存在的file行,将合并方式how='inner'改为how='outer',并额外处理空值情况
  • 新增测试列时,只需修改test_cols列表即可,无需调整对比逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:01:13