1

如果 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 组合中时,重复项才会被删除。

4

2 回答 2

2

假设这些只是列,您可以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

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

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
于 2013-10-24T06:26:45.560 回答
1

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

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

应改为:

df.drop_duplicates(subset=list('ABCD'))
于 2020-09-23T17:07:06.070 回答