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

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


所以这:


A B

1 10

1 20

2 30

2 40

3 10

应该变成这样:


A B

1 20

2 40

3 10

Wes添加了一些不错的功能来删除重复项:http ://wesmckinney.com/blog/?p=340 。但是AFAICT是为精确重复而设计的,因此没有提及选择保留哪些行的标准。


我猜想可能有一个简单的方法可以做到这一点-可能就像在删除重复项之前对数据帧进行排序一样简单-,但是我不知道groupby的内部逻辑足以弄清楚它。有什么建议么?


慕标5832272
浏览 1445回答 3
3回答

红糖糍粑

这需要最后一个。虽然不是最大:In [10]: df.drop_duplicates(subset='A', keep="last")Out[10]:    A   B1  1  203  2  404  3  10您还可以执行以下操作:In [12]: df.groupby('A', group_keys=False).apply(lambda x: x.loc[x.B.idxmax()])Out[12]:    A   BA       1  1  202  2  403  3  10

BIG阳

首要的答案是做太多的工作,对于较大的数据集来说看起来很慢。apply速度慢,应尽可能避免。ix已弃用,也应避免使用。df.sort_values('B', ascending=False).drop_duplicates('A').sort_index()   A   B1  1  203  2  404  3  10或简单地按所有其他列分组并获取所需的最大列数。 df.groupby('A', as_index=False).max()

翻过高山走不出你

这是我必须解决的一个变体,值得分享:对于其中的每个唯一字符串,columnA我想在中找到最常见的关联字符串columnB。df.groupby('columnA').agg({'columnB': lambda x: x.mode().any()}).reset_index()在.any()是否有对应的模式领带挑选一个。(请注意,.any()在一系列上使用会int返回布尔值,而不是选择其中一个。)对于原始问题,相应的方法简化为df.groupby('columnA').columnB.agg('max').reset_index()。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python