当前位置: 首页 > 知识库问答 >
问题:

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

仲孙奇
2023-03-14

我有一个数据帧,在a列中有重复值。我想删除重复值,保留b列中值最高的行。

所以这个:

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

应该变成这个:

A B
1 20
2 40
3 10

我猜可能有一种简单的方法可以做到这一点——可能就像在删除重复项之前对数据帧进行排序一样简单——但我对groupby的内部逻辑了解不够,无法搞清楚。有什么建议吗?

共有3个答案

宦文柏
2023-03-14

最简单的解决方案:

删除基于一列的重复项:

df = df.drop_duplicates('column_name', keep='last')

要删除基于多列的重复项:

df = df.drop_duplicates(['col_name1','col_name2','col_name3'], keep='last')
李康安
2023-03-14

首要答案是做了太多的工作,对于较大的数据集来说看起来非常慢。应用很慢,如果可能的话应该避免。ix已弃用,也应该避免。

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

   A   B
1  1  20
3  2  40
4  3  10

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

栾峰
2023-03-14

这需要最后一个。虽然不是最大值:

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
 类似资料:
  • 假设我有以下数据帧: 我想删除基于列A、B和C的重复项,保留列E最高的行。如果E列中的值相同,则保留D列最高的行。 所以上面的数据帧会变成: 我在那里看到了答案的开头:python熊猫:按列A删除重复项,保留列B中值最高的行,但不幸的是,我无法找到如何处理如果列E中的值相同,则保留列D中的最高值:/ (我正在一个相当大的数据集上运行此代码) 任何帮助赞赏!

  • 我有一个熊猫数据帧,其中包含根据两列(A和B)重复的值: 我想删除重复项,保留列C中具有最大值的行。这将导致: 我不知道如何做到这一点。我应该使用吗?

  • 问题内容: 我有一个熊猫数据框,其中包含根据两列(A和B)重复的值: 我想删除重复项,使行在C列中具有最大值。这将导致: 我不知道该怎么做。我应该使用其他吗? 问题答案: 您可以使用分组依据: 是每个组中的最大值的a ,但与的长度和索引相同。如果您还没有使用过,那么打印可能是个好主意,以了解其工作原理。 使用的另一种方法是 不确定哪种方法更有效,但是我猜第一种方法不涉及排序。 编辑: 从第二个解决

  • 我有下表和Postgres: 作为select查询的一部分,我希望能够基于最高的Col2值(每个Col1值永远不会有多个最高值)在Col1中删除重复项,并保留相应的Col2、Col3值。 期望输出:

  • 我需要删除每个表ID的所有重复项,除了一个之外。像下面这样。我需要删除valueid上01,02,03的所有副本。。。 原件: 应该这样结束: 我试着用这样的东西来做,但是我不知道我怎么才能在id上删除这些内容 有什么建议吗? 提前感谢

  • 问题内容: 编写一个程序来检查列表中是否有重复项,如果删除了重复项,则将其删除,并返回一个包含未重复项/已删除项的新列表。这就是我所拥有的,但老实说我不知道​​该怎么办。 问题答案: 获取唯一项目集合的常用方法是使用。集是不同对象的无序集合。要从任何迭代创建集合,只需将其传递给内置函数即可。如果以后再次需要真实列表,则可以类似地将集合传递给函数。 以下示例应涵盖你尝试做的所有事情: 从示例结果中可