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

新手上路,请多包涵

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

所以这:

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

应该变成这样:

 A B
1 20
2 40
3 10

我猜可能有一种简单的方法可以做到这一点——也许就像在删除重复项之前对 DataFrame 进行排序一样简单——但我不太了解 groupby 的内部逻辑来弄清楚它。有什么建议么?

原文由 Abe 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 643
2 个回答

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

 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

原文由 Wes McKinney 发布,翻译遵循 CC BY-SA 3.0 许可协议

最重要的答案是做太多的工作,并且对于更大的数据集来说看起来非常慢。 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()

原文由 Ted Petrou 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题