如何标记pandas数据框架中的重复组



基于这个问题:在数据框架和这个数据框架中找到重复的组

df = pd.DataFrame({'id': ['A', 'A', 'A', 'A', 'B', 'B', 'C', 'C', 'C', 'C', 'D', 'D', 'D'],
'value1': ['1', '2', '3', '4', '1', '2', '1', '2', '3', '4', '1', '2', '3'],
'value2': ['1', '2', '3', '4', '1', '2', '1', '2', '3', '4', '1', '2', '3'],
'value3': ['1', '2', '3', '4', '1', '2', '1', '2', '3', '4', '1', '2', '3'],
})

我如何在这个数据框的附加列中标记不同的重复组(在值列中)通过唯一的标签,如"1"对于一个重复组,"2";下一个,等等?我在slack上找到了一些例子来区分它们的真假,但其中一个只有"ngroup",但不起作用。

我的实际示例有20+列和nan之间。我已经创建了宽格式的透视表从原来的长格式,因为我认为得到重复的条目是更好的从宽。应该在N-1列中找到重复项,我通过在列表推导中使用子集来总结这些名称,不包括此标识符列

这就是我到目前为止所拥有的:

df = df_long.pivot_table(index="Y",columns="Z",values="value").reset_index()
subset = [c for c in df.columns if not c=="id"]
df = df.loc[df.duplicated(subset=subset,keep=False)].copy()

我们使用pandas 0.22,如果不介意的话。

问题是,当我使用

for i, group in df.groupby(subset):
print(group)

我基本上没有得到任何组。

按照@Chris的建议使用groupby_ngroup:

df['duplicated'] = df.groupby(df.filter(like='value').columns.tolist()).ngroup()
print(df)
# Output:
id value1 value2 value3  duplicated
0   A      1      1      1           0  # Group 0 (all 1)
1   A      2      2      2           1
2   A      3      3      3           2
3   A      4      4      4           3
4   B      1      1      1           0  # Group 0 (all 1)
5   B      2      2      2           1
6   C      1      1      1           0  # Group 0 (all 1)
7   C      2      2      2           1
8   C      3      3      3           2
9   C      4      4      4           3
10  D      1      1      1           0  # Group 0 (all 1)
11  D      2      2      2           1
12  D      3      3      3           2

好的,上面的最后一个评论是正确的提示:我的实际数据中的nan是问题所在,这也是groupby不允许识别组。通过在使用groupby之前使用fillna(),可以识别组,并且ngroup可以为我添加组号。

df['duplicated'] = df.fillna(-1).groupby(df.filter(like='value').columns.tolist()).ngroup()