假设我有以下数据
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 jobs_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
我想识别包含完全相同的文件名(不多不少的文件名)的对(
task_id
和 jobs_id
)。就我而言,结果应该是 [((1, 1), (2, 0), )]
,因为它们恰好包含 (filename1
, filename2
)。
我想我必须分组然后使用frozenset,如
df.groupby(['task_id', 'jobs_id'])['filename'].apply(lambda x: frozenset(x))
task_id jobs_id
1 1 (filename1, filename2)
2 (filename33, filename2342)
2 0 (filename1, filename2)
1 (filename33, filename5)
Name: filename, dtype: object
tmp = (df.groupby(['task_id', 'job_id'])['filename']
.agg(frozenset)[lambda x: x.duplicated(keep=False)]
)
out = pd.DataFrame(tmp.index).groupby(tmp.values)[0].agg(tuple)
出
(filename2, filename1) ((1, 1), (2, 0))
Name: 0, dtype: object