You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 05:35:20