Python 如何将重复数据放在单个列中,按分组放在熊猫中?

Python 如何将重复数据放在单个列中,按分组放在熊猫中?,python,group-by,pandas,duplicates,Python,Group By,Pandas,Duplicates,如果df按A、B和C进行分组,并如下所示: A B C D 1 53704 hf 51602 51602 53802 ss 53802 53802 2 12811 hf 54205 hx 50503 我尝试了以下内容,这与另

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

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

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

更新已接受答案的语法。在1.1.1+中,以下内容:

df.drop_duplicates(cols=list('ABCD'))
应改为:

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

在初始dataframeoops中看不到任何重复项。打字错误修正了它并添加了第二个副本以使事情更加明显。你得到了什么输出?它对我很有用,
df.groupby(('A','B','C')).drop_duplicates('D')
df.drop_duplicates().groupby('A','B','C')
这有点让人困惑,因为您是以列(df['A'])的形式访问它们的,但它们的显示方式与索引类似(这就是您配置repr的方式吗?)…如果没有列,那么首先将它们设置为列将是最简单的。因此,是的,它们实际上是索引,这是以前groupby操作的结果。在这里,我确实显示了我的技能不足,但如何将索引转换为列?我已经查看了set_索引和reindex文档,但我没有理解它。接受这个swer,因为Andy指出我只能使用列,而不能使用索引。