首页 文章

python pandas:删除列A的重复项,保持列B中具有最高值的行

提问于
浏览
80

我在A列中有一个重复值的数据框 . 我想删除重复项,保持B行中具有最高值的行 .

所以这:

A B
1 10
1 20
2 30
2 40
3 10

应该变成这样:

A B
1 20
2 40
3 10

Wes添加了一些很好的功能来删除重复项:http://wesmckinney.com/blog/?p=340 . 但是AFAICT,它没有提到选择保留哪些行的标准 .

我猜这可能是一种简单的方法 - 可能就像在删除重复项之前对数据帧进行排序一样简单 - 但我不知道groupby的内部逻辑是否足够清楚 . 有什么建议?

8 回答

  • 105

    这需要最后一次 . 虽然不是最大值:

    In [10]: df.drop_duplicates(subset='A', keep="last")
    Out[10]: 
       A   B
    1  1  20
    3  2  40
    4  3  10
    

    你也可以这样做:

    In [12]: df.groupby('A', group_keys=False).apply(lambda x: x.loc[x.B.idxmax()])
    Out[12]: 
       A   B
    A       
    1  1  20
    2  2  40
    3  3  10
    
  • 26

    最重要的答案是做了太多的工作,对于大型数据集看起来非常慢 . apply 很慢,如果可能应该避免 . ix 已弃用,也应予以避免 .

    df.sort_values('B', ascending=False).drop_duplicates('A').sort_index()
    
       A   B
    1  1  20
    3  2  40
    4  3  10
    

    或者只是按所有其他列分组并获取所需列的最大值 . df.groupby('A', as_index=False).max()

  • 1

    试试这个:

    df.groupby(['A']).max()
    
  • 6

    你也可以试试这个

    df.drop_duplicates(subset='A', keep='last')
    

    我从https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html提到了这个

  • 0

    我认为在你的情况下,你真的不需要一个groupby . 我会按降序排序你的B列,然后在A列删除重复项,如果你愿意,你也可以有一个新的漂亮而干净的索引:

    df.sort_values('B', ascending=False).drop_duplicates('A').sort_index().reset_index(drop=True)
    
  • -5

    当已经发布帖子回答问题时,我通过添加应用了max()函数的列名进行了一些小改动,以获得更好的代码可读性 .

    df.groupby('A', as_index=False)['B'].max()
    
  • -1

    这也有效:

    a=pd.DataFrame({'A':a.groupby('A')['B'].max().index,'B':a.groupby('A')       ['B'].max().values})
    
  • 1

    我不打算给你完整的答案(我还没有找到解析和写入文件部分),但一个关键的提示应该足够了:使用python的 set() 函数,然后 sorted().sort() 加上 .reverse()

    >>> a=sorted(set([10,60,30,10,50,20,60,50,60,10,30]))
    >>> a
    [10, 20, 30, 50, 60]
    >>> a.reverse()
    >>> a
    [60, 50, 30, 20, 10]
    

相关问题