根据 A、B 两列删除数据框中的重复项,将最大值的行保留在另一列 C 中
- 2025-04-16 08:57:00
- admin 原创
- 16
问题描述:
我有一个 pandas 数据框,其中包含两列(A 和 B)的重复值:
A B C
1 2 1
1 2 4
2 7 1
3 4 0
3 4 8
我想删除重复项,保留 C 列中具有最大值的行。这将导致:
A B C
1 2 4
2 7 1
3 4 8
我不知道该怎么做。我应该用drop_duplicates()
还是其他什么?
解决方案 1:
您可以使用 group by 来完成:
c_maxes = df.groupby(['A', 'B']).C.transform(max)
df = df.loc[df.C == c_maxes]
c_maxes
是每个组中Series
最大值之一C
,但其长度和索引与 相同df
。如果您还没有使用过,.transform
那么打印出来c_maxes
看看它是如何工作的可能是个好主意。
另一种方法drop_duplicates
是
df.sort('C').drop_duplicates(subset=['A', 'B'], take_last=True)
不确定哪种方法更有效,但我猜是第一种方法,因为它不涉及排序。
编辑:
从pandas 0.18
上面来看,第二个解决方案是
df.sort_values('C').drop_duplicates(subset=['A', 'B'], keep='last')
或者,
df.sort_values('C', ascending=False).drop_duplicates(subset=['A', 'B'])
无论如何,该groupby
解决方案似乎效果更佳:
%timeit -n 10 df.loc[df.groupby(['A', 'B']).C.max == df.C]
10 loops, best of 3: 25.7 ms per loop
%timeit -n 10 df.sort_values('C').drop_duplicates(subset=['A', 'B'], keep='last')
10 loops, best of 3: 101 ms per loop
解决方案 2:
我认为 groupby 应该可以工作。
df.groupby(['A', 'B']).max()['C']
如果您需要返回数据框,您可以链接重置索引调用。
df.groupby(['A', 'B']).max()['C'].reset_index()
解决方案 3:
drop_duplicates
你可以按照自己想要的方式去做
# initialisation
d = pd.DataFrame({'A' : [1,1,2,3,3], 'B' : [2,2,7,4,4], 'C' : [1,4,1,0,8]})
d = d.sort_values("C", ascending=False)
d = d.drop_duplicates(["A","B"])
如果获得相同的订单很重要
d = d.sort_index()
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD