如何在 pandas 数据框中标记重复组
How to label duplicated groups in a pandas dataframe
基于这个问题: 和这个数据框
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。我通过 pivot_table 从原始长格式创建了宽格式,因为我认为从宽格式获取重复的条目更好。应在 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()
基于这个问题:
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。我通过 pivot_table 从原始长格式创建了宽格式,因为我认为从宽格式获取重复的条目更好。应在 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()