【问题标题】:How can I drop duplicate data in a single column, group-wise in pandas?如何在熊猫中按组将重复数据放在单个列中?
【发布时间】:2013-11-02 14:00:49
【问题描述】:

如果 df 按 A、B 和 C 分组,看起来像这样:

    A    B      C    D
    1    53704  hf   51602
                     51602   
                     53802
                ss   53802
                     53802
    2    12811  hf   54205
                hx   50503

我已经尝试了以下内容,这与另一篇文章中的内容相似:

    df.groupby([df['A'], df['B'], df['C']]).drop_duplicates(cols='D')

这显然是不正确的,因为它会产生一个空数据框。我还尝试了 drop_duplicates 的另一种变体,它只是从“D”中删除所有重复项,无论它在哪个组中。我正在寻找的输出是:

    A    B      C   D
    1    53704  hf  51602
                    53802
                ss  53802
    2    12811  hf  54205
                hx  50503

这样重复项只有在分组到相同的 A/B/C 组合时才会被删除。

【问题讨论】:

  • 在您的初始数据框中看不到任何重复项
  • 哎呀。错字。修复它并添加第二个副本以使事情更明显。
  • 你得到什么输出?它对我有用,df.groupby(('A','B','C')).drop_duplicates('D') 或 df.drop_duplicates().groupby(('A','B','C')
  • 这有点令人困惑,因为您将这些作为列 (df['A']) 访问,但它们像索引一样显示(这就是您配置代表的方式吗?)...如果没有列,首先将它们设为列,这将是最简单的。
  • 所以是的,它们实际上是索引,这是之前 groupby 操作的结果。在这里,我确实表现出我缺乏技能,但是如何将索引转换为列?我查看了 set_index 和 reindex 文档,但我不明白。

标签: python group-by pandas duplicates


【解决方案1】:

假设这些只是列,您可以直接使用drop_duplicates:

In [11]: df.drop_duplicates(cols=list('ABCD'))
Out[11]: 
   A      B   C      D
0  1  53704  hf  51602
2  1  53704  hf  53802
3  1  53704  ss  53802
5  2  12811  hf  54205
6  2  12811  hx  50503

如果您对 all 列的重复项感兴趣,则无需指定:

In [12]: df.drop_duplicates()
Out[12]: 
   A      B   C      D
0  1  53704  hf  51602
2  1  53704  hf  53802
3  1  53704  ss  53802
5  2  12811  hf  54205
6  2  12811  hx  50503

【讨论】:

  • 接受这个答案,因为安迪指出我只能用列而不是索引来做到这一点。
【解决方案2】:

更新已接受答案的语法。在 pandas 1.1.1 + 以下:

df.drop_duplicates(cols=list('ABCD'))

应改为:

df.drop_duplicates(subset=list('ABCD'))

【讨论】:

    猜你喜欢
    • 2018-11-03
    • 2017-02-16
    • 2018-07-10
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多