按列A去重,保留列B中最高值所在的行。

315
我有一个包含重复值的A列数据框。我想删除重复项,保留B列中具有最高值的行。 所以原始数据如下:
A B
1 10
1 20
2 30
2 40
3 10

应该变成这样:

A B
1 20
2 40
3 10

我猜可能有一种简单的方法来做到这一点——也许只需在删除重复项之前对DataFrame进行排序,但我不太了解groupby的内部逻辑,不能想出来。您有什么建议吗?


1
请注意,问题中的URL已经过时。 - DaveL17
为了达到惯用且高效的方式,请参考下面的解决方案:点击此处 - Ted Petrou
时间已经过去...就我目前的了解,我相信这个下面的解决方案更快(至少在存在大量重复项的情况下),而且更简单。 - Pierre D
15个回答

0

当已有的帖子回答了问题时,我进行了小改动,通过添加应用max()函数的列名来提高代码可读性。

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

请在回答问题时提供更多的上下文,解释它们的工作原理以及为什么它们比已有的答案更优秀或是互补的。如果它们没有提供附加价值,请不要在旧问题上发布额外的答案。最后,请通过缩进将您的代码格式化为代码块。 - WhoIsJack

0
非常类似于所选答案的方法,但按多列排序数据框可能是一种更容易编码的方式。
首先,按"A""B"列对日期框进行排序,ascending=False确保它从最高值到最低值排名:
df.sort_values(["A", "B"], ascending=False, inplace=True)

然后,去除重复项并仅保留第一个项目,该项目已经具有最高的值:
df.drop_duplicates(inplace=True)

0

如果你最终来到这里,并且有一个包含多个相同列(其中一些是不同的)的数据框,并且想保留原始索引:

df = (df.sort_values('B', ascending=False)
         .drop_duplicates(list(final_out_combined.columns.difference(['B'],sort=False)))
         .sort_index())

在代码行drop_duplicates中,您可以添加可能存在差异的列,例如:
drop_duplicates(list(final_out_combined.columns.difference(['B', 'C'],sort=False)))

意思是BC不检查重复项。

-1

这个也可以工作:

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

虽然这段代码可能解决了问题,但包括解释确实有助于提高您的帖子质量。请记住,您为将来的读者回答问题,这些人可能不知道您推荐代码的原因。还请尽量不要在代码中加入过多的解释性注释,这会降低代码和解释的可读性! - Martin Tournoij

-11

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

9
或许我错了,但是将pandas DataFrame转换为集合,再转回来解决这个问题似乎非常低效。我正在进行日志分析,因此我需要将其应用于一些非常大的数据集。 - Abe
抱歉,我对这个特定场景了解不多,所以我的通用答案可能对您的问题不太有效。 - Abhranil Das

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接