当前位置: 首页 > 面试题库 >

基于两列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()其他吗?


问题答案:

您可以使用分组依据:

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

c_maxes是每个组Series中的最大值的a
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


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

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

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

  • 我有一个数据帧列表。列表中的每个数据帧都是唯一的,这意味着有一些共享但不同的列。我想创建一个dataframe,它包含dataframe列表中的所有列,如果元素不存在,它将填充NaN。我试过以下方法 问题似乎是由于列表中的数据帧造成的。每个数据帧只有一行,因此其索引为零,因此重新编制索引不会起作用。我试过这个: 几乎生成一个随机数作为索引。但是,要获得此错误,请执行以下操作:

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

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