对比多份CSV文件与主文件,保留匹配值最多文件的技术问题
保留与主CSV匹配数最多的文件(删除其余文件)
问题分析
你当前的代码仅能计算并打印每个CSV文件与主文件的values列匹配数,但缺少记录匹配数与文件对应关系、筛选最大值文件、删除其余文件的逻辑。另外原匹配数计算方式可以优化,提升大文件处理效率。
解决方案
我们需要:
- 用集合存储主文件的
values值,快速统计子文件的匹配数(比concat+duplicated高效得多) - 记录每个文件的路径和对应的匹配数
- 找到匹配数最大的文件(支持多个文件同最大值的情况)
- 删除所有非最大匹配的文件
修改后的完整代码
import pandas as pd import glob import os # 读取主文件并提取values列到集合(去重+快速匹配) data0 = pd.read_csv('input_path/master_file.csv', sep=',') master_values = set(data0['values'].dropna()) # 去除空值避免无效匹配 # 获取所有待对比的CSV文件路径 csv_files = glob.glob(fr'path_to_files_in_comparison\**\*.csv', recursive=True) # 存储每个文件的匹配数和路径 file_matches = [] for file_path in csv_files: df_base = os.path.basename(file_path) input_dir = os.path.dirname(file_path) # 读取子文件并计算匹配数 data1 = pd.read_csv(file_path, sep=',') # 统计子文件中values存在于主文件的数量 match_count = data1['values'].dropna().isin(master_values).sum() print(f'Matches between {df_base} & {input_dir}: {match_count}') file_matches.append((match_count, file_path)) # 处理匹配数最大值逻辑 if not file_matches: print("未找到待对比的CSV文件") else: # 获取最大匹配数 max_count = max(file_matches, key=lambda x: x[0])[0] # 收集所有匹配数等于最大值的文件 max_match_files = [fp for cnt, fp in file_matches if cnt == max_count] # 保留最大匹配文件,删除其他 for file_path in csv_files: if file_path not in max_match_files: os.remove(file_path) print(f"已删除文件: {file_path}") # 输出结果 if len(max_match_files) == 1: print(f"\n保留匹配数最多的文件: {max_match_files[0]},匹配数: {max_count}") else: print(f"\n发现{len(max_match_files)}个文件匹配数同为最大值({max_count}),已保留以下文件:") for fp in max_match_files: print(fp)
关键优化点
- 用集合替代
concat+duplicated的方式计算匹配数,时间复杂度从O(n+m)降到O(1)级别的查找,处理大文件时性能提升明显 - 避免使用内置函数名
sum作为变量名,防止覆盖内置函数 - 支持多个文件匹配数同为最大值的场景,避免误删
内容的提问来源于stack exchange,提问作者P.K.
相关产品推荐
相关产品推荐

