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

基于两列A、B,从数据帧中删除重复项,在另一列C中保留具有最大值的行

曹华荣
2023-03-14

我有一个熊猫数据帧,其中包含根据两列(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()吗?

共有3个答案

丁雅惠
2023-03-14

我认为分组应该工作。

df.groupby(['A', 'B']).max()['C']

如果需要数据帧,可以链接重置索引调用。

df.groupby(['A', 'B']).max()['C'].reset_index()
符风畔
2023-03-14

您只需使用pandas drop duplicates函数即可完成此操作

df.drop_duplicates(['A','B'],keep= 'last')
康锦
2023-03-14

您可以使用组由:

c_maxes = df.groupby(['A', 'B']).C.transform(max)
df = df.loc[df.C == c_maxes]

c_maxes是每个组中c的最大值的系列,但其长度和索引df相同。如果您没有使用。转换然后打印<code>c_maxes

另一种使用drop_duplicates的方法是

df.sort('C').drop_duplicates(subset=['A', 'B'], take_last=True)

不确定哪个更有效,但我想是第一种方法,因为它不涉及排序。

编辑:从< code>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'])

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

  • 我有一个数据帧,在a列中有重复值。我想删除重复值,保留b列中值最高的行。 所以这个: 应该变成这个: 我猜可能有一种简单的方法可以做到这一点——可能就像在删除重复项之前对数据帧进行排序一样简单——但我对groupby的内部逻辑了解不够,无法搞清楚。有什么建议吗?

  • 我有这样一个数据帧: 我如何摆脱第四行,因为它有sq_resid的最大值?注意:最大值将从一个数据集更改到另一个数据集,所以仅仅删除第4行是不够的。 我已经尝试了一些方法,比如我可以删除像下面这样留下数据帧的最大值,但是无法删除整行。

  • 我使用Pandas read_csv从csv文件导入了一个数据帧。它的形状是735,36。我需要删除最后33列-保留前3列。这些列是,, 我已经尝试了这里所有的建议 无论我做什么,我都会得到以下错误: 例如: 我又开始了。“bool对象不可下标”错误已经消失,我认为df已经被覆盖。 我试图使用一些公开的医院活动数据,并从中提取数据。我是一名神经外科医生,所以你可能需要耐心。数据在这里https:/

  • 我有一个大型数据框(超过100列,还有几行10万行),其中包含许多包含重复数据的行。我正在尝试删除重复的行,将具有最大值的行保留在不同的列中。 本质上,我是根据时间段将数据分类到各个箱中,所以在不同的时间段,人们会发现很多重复,因为大多数实体存在于所有的时间段。然而,不允许的是同一实体在给定的时间段内出现不止一次。 我在python pandas中尝试了这种方法:通过列A删除重复项,在数据子集上保

  • 我有一个这样的数据帧(): 我想基本上删除重复记录,以便字段是唯一的。我不关心被丢弃的记录,在这种情况下,地址已经被删除,所以唯一通过的是拼写错误。我想要以下结果的数据框: 在R中,基本上是这样做的: 但是我需要一种方法在熊猫身上做到这一点。