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]