Python中批量识别重复DataFrame并统计高频重复文件的实现求助
解决CSV重复文件检测与统计方案
针对你处理400个CSV文件的需求,以下是优化后的实现方案,解决你提到的形状检查、多文件兼容以及相同文件分组存储的问题:
核心思路
- 批量读取CSV文件,用字典统一管理文件信息,避免单独定义变量
- 优先按文件形状(行数+列数)分组,快速排除不可能重复的文件
- 对同形状文件按第一列排序后生成唯一哈希值,相同内容的文件哈希值一致
- 按哈希值分组统计重复文件,最终找出出现次数最多的组
完整代码实现
import pandas as pd import os import hashlib def get_df_hash(df): # 生成排序后DataFrame的唯一哈希值(忽略索引) return hashlib.sha256(pd.util.hash_pandas_object(df, index=False).values).hexdigest() # 替换为你的CSV文件所在目录路径 csv_directory = "./csv_files" file_records = {} # 批量读取并处理所有CSV文件 for file_name in os.listdir(csv_directory): if not file_name.endswith(".csv"): continue file_path = os.path.join(csv_directory, file_name) # 强制读取前2列,避免文件中存在多余列干扰判断 df = pd.read_csv(file_path, usecols=[0, 1], header=None) df_shape = df.shape # 按第一列排序并重置索引,消除原始排序差异 sorted_df = df.sort_values(by=0).reset_index(drop=True) # 计算哈希值作为内容唯一标识 df_hash = get_df_hash(sorted_df) file_records[file_name] = (df_shape, df_hash) # 按形状分组,仅同形状文件参与后续比较 shape_based_groups = {} for fname, (shape, hsh) in file_records.items(): shape_based_groups.setdefault(shape, {}).setdefault(hsh, []).append(fname) # 筛选出重复文件组并排序 duplicate_groups = [] for shape, hash_groups in shape_based_groups.items(): for hsh, fnames in hash_groups.items(): if len(fnames) > 1: duplicate_groups.append((len(fnames), shape, fnames)) # 输出结果 if duplicate_groups: # 按重复次数降序排列 duplicate_groups.sort(reverse=True, key=lambda x: x[0]) most_freq_group = duplicate_groups[0] print(f"重复次数最多的文件组:") print(f"重复次数:{most_freq_group[0]}") print(f"文件形状:{most_freq_group[1]}") print(f"包含文件:{most_freq_group[2]}") else: print("未检测到重复的CSV文件")
针对你痛点的优化说明
- 完善形状检查逻辑:通过
shape_based_groups字典直接按文件形状分组,不同形状的文件完全隔离,无需逐个比较,大幅提升效率,同时避免无效计算。 - 兼容任意数量文件:用
file_records字典存储所有文件的形状和哈希信息,不管是8个测试文件还是400个正式文件,都能无缝处理,无需手动定义变量。 - 存储重复文件的文件名:最终通过哈希分组得到的是文件名列表,比存储变量名更实用(批量处理时不可能给每个文件单独定义变量),直接对应到实际文件,方便后续操作。
内容的提问来源于stack exchange,提问作者Y. Pat
相关产品推荐
相关产品推荐

