pd.duplicated() 重复组

mon*_*art 2 group-by pandas

我有一个包含许多列和行的大数据框,这些数据框是由许多 Excel 文件生成的。我想找到导致重复的文件,因为有时文件部分包含不应出现在 Excel 文件中的观察结果。我知道 df[df.duplicate(subset=['A','B'],keep=False)] 给了我所有重复的行。

import pandas as pd
df = pd.DataFrame({'A':[1,1,2,2,2,2,3,3],'B':['Q','Q','R','R','R','P','L','L'],'origin':['file1','file2','file3','file4','file5','file6','file7','file8']})
Run Code Online (Sandbox Code Playgroud)

我希望结果看起来像

result = pd.DataFrame({'A':[1,1,2,2,2,3,3],'B':['Q','Q','R','R','R','L','L'],'origin':['file1','file2','file3','file4','file5','file7','file8'],'group':['g1','g1','g2','g2','g2','g3','g3'],'duplicate_count':[2,2,3,3,3,2,2]})
Run Code Online (Sandbox Code Playgroud)

但是,我希望始终将两个(或更多)相应的重复项分组,然后打印相应的文件以及重复项发生的次数。我没有成功找到答案。

jez*_*ael 8

使用duplicatedwithkeep='False'过滤所有重复项boolean indexing,然后sort_values,对于每组的数字,使用ngroup, 进行transform计数size

cols = ['A','B']
df1 = df[df.duplicated(subset=cols,keep=False)].copy()
df1 = df1.sort_values(cols)
df1['group'] = 'g' + (df1.groupby(cols).ngroup() + 1).astype(str)
df1['duplicate_count'] = df1.groupby(cols)['origin'].transform('size')
print (df1)
   A  B origin group  duplicate_count
0  1  Q  file1    g1                2
1  1  Q  file2    g1                2
2  2  R  file3    g2                3
3  2  R  file4    g2                3
4  2  R  file5    g2                3
6  3  L  file7    g3                2
7  3  L  file8    g3                2
Run Code Online (Sandbox Code Playgroud)