基于文件名匹配比较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
相关产品推荐
相关产品推荐

