【问题标题】:How to label duplicated groups in a pandas dataframe如何在熊猫数据框中标记重复的组
【发布时间】:2021-12-11 21:00:20
【问题描述】:

基于这个问题:find duplicated groups in 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)

我基本上不回任何组。

【问题讨论】:

  • df['duplicated']= df.groupby(['value1','value2','value3']).ngroup()
  • 当然,您需要从数据框构造函数中删除 duplicated,因为您不能将空列表作为列值。
  • 我已经在我的真实数据集上尝试过,但在所有行中只得到相同的标签“-1”。但是,由于我已经创建了带有重复 (keep=False) 的 df,因此我希望得到不同的标签。
  • 我删除了上面示例中的“重复”,因为我的真实数据框中也没有它。

标签: python pandas duplicates


【解决方案1】:

按照@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

【讨论】:

  • 如果失败,您可以分享您的数据的真实样本吗?
  • 这就是我想要得到的结果。但是,是的,这失败了,我只得到“-1”。它是机密的,很难得到真正的代码。让我看看。
  • 我不明白你为什么用ngroup 得到-1。也许,试着打乱你的数据?
  • 如果组标识符是NaNNaN-like,则 -1 出现在 ngroup 中。 @Corralien pd.DataFrame({'A': [np.nan, 1, 1, 2, 2]}).groupby('A').ngroup() -> [-1 0 0 1 1]
  • @Rockbar。是的,您可以用一个值替换 NaN。例如:df.fillna(np.inf).groupby(df.filter(like='value').columns.tolist()).ngroup()
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    相关资源
    最近更新 更多