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

我有列A中的重复值的dataframe。我想删除重复项,保留在列B中具有最高值的行。

所以这:

AB 1 10 1 20 2 30 2 40 3 10 

应该变成这样:

 AB 1 20 2 40 3 10 

Wes添加了一些很好的function来删除重复项: http ://wesmckinney.com/blog/?p=340。 但是AFAICT,它是专门为重复而devise的,所以没有提到select哪些行的条件。

我猜可能有一个简单的方法来做到这一点—也许就像在丢弃重复数据之前对数据框进行sorting一样简单—但是我不知道groupby的内部逻辑是否足够清楚。 有什么build议么?

这需要最后一个。 不是最大的,但:

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

你也可以这样做:

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

尝试这个:

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

最好的答案是做了太多的工作,而且对于更大的数据集看起来非常慢。 apply是缓慢的,应尽可能避免。 ix已被弃用,应该避免。

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

或者简单地按照所有其他列进行分组,并取得所需列的最大值。 df.groupby('A', as_index=False).max()

你也可以试试这个

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

我从https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html

这也适用:

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

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

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

我不会给你全部的答案(我不认为你正在寻找parsing和写入文件部分),但一个关键的提示应该足够了:使用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]