在Pandas中识别包含完全相同文件名的重复分组
找出文件名完全一致的分组对
问题背景
给定如下DataFrame,需要找出文件名的内容和数量完全匹配的(task_id, job_id)分组对,示例中预期结果为[((1, 1), (2, 0))],因为这两个分组都包含filename1和filename2各一次。
示例数据
创建DataFrame代码
import pandas as pd df = pd.DataFrame({ 'task_id': [1, 1, 1, 1, 2, 2, 2, 2], 'job_id': [1, 1, 2, 2, 0, 0, 1, 1], 'filename': ['filename1', 'filename2', 'filename33', 'filename2342', 'filename1', 'filename2', 'filename33', 'filename5'] })
数据预览
task_id job_id filename 0 1 1 filename1 1 1 1 filename2 2 1 2 filename33 3 1 2 filename2342 4 2 0 filename1 5 2 0 filename2 6 2 1 filename33 7 2 1 filename5
初步尝试的局限
你提到用frozenset分组的方式:
df.groupby(['task_id', 'job_id'])['filename'].apply(lambda x: frozenset(x))
得到的结果:
task_id job_id 1 1 (filename1, filename2) 2 (filename33, filename2342) 2 0 (filename1, filename2) 1 (filename33, filename5) Name: filename, dtype: object
但frozenset会自动去重,无法区分文件名数量不同的分组(比如一个分组有两个filename1,另一个只有一个,frozenset会认为两者相同),所以不能满足“数量一致”的要求。
完整解决方案
要同时匹配文件名的内容和数量,可以用以下两种方法:
方法1:排序后的元组(推荐,适用于无重复文件的场景)
通过将每个分组的文件名排序后转为元组,确保内容和数量都一致的分组会生成相同的标识:
# 生成每个分组的文件签名 grouped = df.groupby(['task_id', 'job_id'])['filename'].apply(lambda x: tuple(sorted(x))).reset_index(name='file_signature') # 筛选出重复的签名 duplicate_sigs = grouped['file_signature'].value_counts()[lambda cnt: cnt > 1].index # 提取对应的分组对 result = [] for sig in duplicate_sigs: matched_groups = grouped[grouped['file_signature'] == sig][['task_id', 'job_id']].apply(tuple, axis=1).tolist() result.append(tuple(matched_groups))
执行后得到预期结果:
[((1, 1), (2, 0))]
方法2:Counter冻结集合(适用于有重复文件的场景)
如果分组中存在重复文件名,需要匹配文件名和出现次数,可以用collections.Counter生成包含文件计数的签名:
from collections import Counter # 生成包含文件计数的签名 grouped = df.groupby(['task_id', 'job_id'])['filename'].apply(lambda x: frozenset(Counter(x).items())).reset_index(name='file_signature') # 后续步骤和方法1一致 duplicate_sigs = grouped['file_signature'].value_counts()[lambda cnt: cnt > 1].index result = [] for sig in duplicate_sigs: matched_groups = grouped[grouped['file_signature'] == sig][['task_id', 'job_id']].apply(tuple, axis=1).tolist() result.append(tuple(matched_groups))
这种方法能精准匹配文件内容和出现次数都完全相同的分组。
内容的提问来源于stack exchange,提问作者Ruggero Turra
相关产品推荐
相关产品推荐

