基于这个问题:在数据框架和这个数据框架中找到重复的组
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()