如何在Python字典的DataFrame中查找跨文件重复ID值
跨文件查找DataFrame中重复ID的解决方案
现有一个字典splitfiles,键是含"split.csv"的文件名,对应值是包含ID、Group列的DataFrame。需要查找所有文件中重复出现的ID值,但原代码因将DataFrame作为字典键触发TypeError: unhashable type: 'DataFrame',期望输出格式如duplicate values [2]。
原初始化代码
import pandas as pd import os folderpath= (r"path") filenames = dict() for file in os.listdir(folderpath): if file.endswith(".csv"): filenames[file] = pd.read_csv(os.path.join((folderpath), file)) splitfiles=({k:v for k,v in filenames.items() if 'split.csv' in k})
错误代码(触发TypeError)
rev_dict = {} for key, value in splitfiles.items(): rev_dict.setdefault(value, set()).add(key) result = [key for key, values in rev_dict.items() if len(values) > 1] print("duplicate values", str(result))
错误原因
原代码试图将整个DataFrame作为rev_dict的键,但DataFrame是不可哈希的对象(unhashable type),无法作为字典的键使用。我们需要提取每个DataFrame中的ID列数据,而非整个DataFrame来做重复判断。
修正方案
基础版:仅获取重复ID值
收集所有文件中的ID值,统计出现次数后筛选出重复项:
# 收集所有文件中的ID all_ids = [] for df in splitfiles.values(): all_ids.extend(df['ID'].tolist()) # 统计每个ID的出现次数 id_counts = pd.Series(all_ids).value_counts() # 筛选出重复的ID(出现次数>1) duplicate_ids = id_counts[id_counts > 1].index.tolist() # 输出结果 print(f"duplicate values {duplicate_ids}")
进阶版:同时获取重复ID所在的文件名
如果需要知道重复ID出现在哪些文件中,可记录每个ID对应的文件名集合:
id_files = {} for filename, df in splitfiles.items(): for id_val in df['ID'].unique(): id_files.setdefault(id_val, set()).add(filename) # 筛选出出现在多个文件中的ID duplicate_ids_with_files = {id_val: files for id_val, files in id_files.items() if len(files) > 1} print("重复ID及对应文件:") for id_val, files in duplicate_ids_with_files.items(): print(f"ID {id_val}: {', '.join(files)}")
以上方案既解决了原有的TypeError问题,又能准确得到跨文件重复的ID值,满足需求。
内容的提问来源于stack exchange,提问作者greg gregg
相关产品推荐
相关产品推荐

