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

熊猫 - 从另一列中删除重复的行,但具有最大值的行除外

施兴言
2023-03-14

我有一个大型数据框(超过100列,还有几行10万行),其中包含许多包含重复数据的行。我正在尝试删除重复的行,将具有最大值的行保留在不同的列中。

本质上,我是根据时间段将数据分类到各个箱中,所以在不同的时间段,人们会发现很多重复,因为大多数实体存在于所有的时间段。然而,不允许的是同一实体在给定的时间段内出现不止一次。

我在python pandas中尝试了这种方法:通过列A删除重复项,在数据子集上保留列B中具有最高值的行,并计划与原始数据帧df重新组合。

数据子集示例:

              unique_id   period_id   liq
index                                   
19            CAN00CE0     199001  0.017610
1903          **USA07WG0** 199001  1.726374
12404         **USA07WG0** 199001  0.090525
13330         USA08DE0     199001  1.397143
14090         USA04U80     199001  2.000716
12404         USA07WG0     199002  0.090525
13330         USA08DE0     199002  1.397143
14090         USA04U80     199002  2.000716

在上面的示例中,我希望保留第一个实例(因为liq较高,为1.72),并丢弃第二个实例(liq较低,为0.09)。注意,在给定的period_id中可以有两个以上的重复。

我尝试了这个,但对我来说很慢(超过5分钟后我停止了它):

def h(x):
    x = x.dropna() #idmax fails on nas, and happy to throw out where liq is na.
    return x.ix[x.liq.idmax()]

df.groupby([‘holt_unique_id’, ‘period_id’], group_keys = False).apply(lambda x: h(x))

我最终完成了下面的工作,它更加冗长和丑陋,并且简单地抛出了除一个副本之外的所有副本,但这也是非常慢的!考虑到其他类似复杂操作的速度,我想我会在这里寻求更好的解决方案。

因此,我的请求实际上是修复上面的代码,以便它更快,下面给出了指导,如果在下面的静脉中,也许我也可以丢弃基于索引的重复,而不是我采用的reset_index/set_index方法:

def do_remove_duplicates(df):
    sub_df = df[['period_id', 'unique_id']] 
    grp = sub_df.groupby(['period_id', 'unique_id'], as_index = False)
    cln = grp.apply(lambda x: x.drop_duplicates(cols = 'unique_id'))   #apply drop_duplicates.  This line is the slow bit!
    cln = cln.reset_index()   #remove the index stuff that has been added
    del(cln['level_0'])   #remove the index stuff that has been added
    cln.set_index('level_1', inplace = True)   #set the index back to the original (same as df).
    df_cln = cln.join(df, how = 'left', rsuffix = '_right')   # join the cleaned dataframe with the original, discarding the duplicate rows using a left join.
    return df_cln

共有1个答案

舒永嘉
2023-03-14

这个怎么样:

  • 使用最大数据更新所有列。
  • 选一行(说第一行)。

这应该要快得多,因为它是矢量化的。

In [11]: g = df.groupby(["unique_id", "period_id"], as_index=False)

In [12]: g.transform("max")
Out[12]:
            liq
index
19     0.017610
1903   1.726374
12404  1.726374
13330  1.397143
14090  2.000716
12404  0.090525
13330  1.397143
14090  2.000716

In [13]: df.update(g.transform("max"))

In [14]: g.nth(0)
Out[14]:
          unique_id  period_id       liq
index
19         CAN00CE0     199001  0.017610
1903   **USA07WG0**     199001  1.726374
13330      USA08DE0     199001  1.397143
14090      USA04U80     199001  2.000716
12404      USA07WG0     199002  0.090525
13330      USA08DE0     199002  1.397143
14090      USA04U80     199002  2.000716

注意:我想在这里先使用groupby,然后再使用groupby。但我认为这是一个错误,它们会丢弃旧索引,我认为它们不应该这样做……不过,第n个是可行的。

另一种方法是首先切掉不等于liq max的部分:

(df[df["liq"] == g["liq"].transform("max")]  #  keep only max liq rows
 .groupby(["unique_id", "period_id"])
 .nth(0)
 类似资料:
  • 如何删除重复行,但保留所有行的最大值。例如,我有一个包含4行的数据帧: 从这个数据帧中,我想有一个这样的数据帧(3行,按'a'分组,保留所有在'c'中有最大值的行):

  • 问题内容: 我有一个看起来像这样的熊猫数据框。 我想确定cat和bat是重复的相同值,因此想删除一个记录并仅保留第一条记录。结果数据帧应该只有一个。 问题答案: 使用具有与列的列表上检查重复和保持第一重复的。 如果是: 结果: 然后: 结果:

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

  • 问题内容: 我必须清理具有重复行的表: 一个可能具有多个值: 我想对整个表执行一个查询,并删除和重复的所有行。在上面的示例中,删除后,我只想剩下1、2、4和5。 问题答案: ;WITH x AS ( SELECT id, gid, url, rn = ROW_NUMBER() OVER (PARTITION BY gid, url ORDER BY id) FROM dbo.table ) SEL

  • 我有一个熊猫数据框,看起来像这样。 我想确定猫和蝙蝠是重复的相同值,因此想删除一条记录,只保留第一条记录。所得到的数据帧应该只具有。