为了账号安全,请及时绑定邮箱和手机立即绑定

仅删除组内的重复项

仅删除组内的重复项

动漫人物 2021-09-25 21:40:41
我只想从数据框中删除特定子集中的重复项。在“A”列中的每个“规范”下,我想删除重复项,但我想在整个数据框中保留重复项(第一个“规范”下可能有一些行与第二个“规范”,但在“规范”下直到下一个“规范”我想删除重复项)这是数据框df  A          B            C  spec       first        second  test       text1        text2  act        text12       text13  act        text14       text15  test       text32       text33  act        text34       text35  test       text85       text86  act        text87       text88  test       text1        text2  act        text12       text13  act        text14       text15  test       text85       text86  act        text87       text88  spec       third        fourth  test       text1        text2  act        text12       text13  act        text14       text15  test       text85       text86  act        text87       text88  test       text1        text2  act        text12       text13  act        text14       text15  test       text85       text86  act        text87       text88这就是我想要的:df  A          B            C  spec       first        second  test       text1        text2  act        text12       text13  act        text14       text15  test       text32       text33  act        text34       text35  test       text85       text86  act        text87       text88  spec       third        fourth  test       text1        text2  act        text12       text13  act        text14       text15  test       text85       text86  act        text87       text88我可以将数据帧拆分为“小”数据帧,然后在 for 循环中为每个“小”数据帧删除重复项,最后将它们连接起来,但我想知道是否还有其他解决方案。我也尝试过并成功了:dfList = df.index[df["A"] == "spec"].tolist()dfList = np.asarray(dfList)for dfL in dfList:      idx = np.where(dfList == dfL)      if idx[0][0]!=(len(dfList)-1):            df.loc[dfList[idx[0][0]]:dfList[idx[0][0]+1]-1]                     = df.loc[dfList[idx[0][0]]:dfList[idx[0][0]+1]-1].drop_duplicates()      else:            df.loc[dfList[idx[0][0]]:] = df.loc[dfList[idx[0][0]]:].drop_duplicates()编辑:我必须将其添加到最后:df.dropna(how='all', inplace=True)但我只是想知道是否还有其他解决方案。
查看完整描述

3 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

这应该有效:

df2 = df.drop_duplicates(subset=['A', 'B','C'])


查看完整回答
反对 回复 2021-09-25
?
湖上湖

TA贡献2003条经验 获得超2个赞

使用groupby+ duplicated:


df[~df.groupby(df.A.eq('spec').cumsum()).apply(lambda x: x.duplicated()).values]


       A       B       C

0   spec   first  second

1   test   text1   text2

2    act  text12  text13

3    act  text14  text15

4   test  text32  text33

5    act  text34  text35

6   test  text85  text86

7    act  text87  text88

13  spec   third  fourth

14  test   text1   text2

15   act  text12  text13

16   act  text14  text15

17  test  text85  text86

18   act  text87  text88

细节


我们使用cumsum. 组标签是:


df.A.eq('spec').cumsum()


0     1

1     1

2     1

3     1

4     1

5     1

6     1

7     1

8     1

9     1

10    1

11    1

12    1

13    2

14    2

15    2

16    2

17    2

18    2

19    2

20    2

21    2

22    2

23    2

Name: A, dtype: int64

然后在此系列上完成分组,并计算每组的重复项:


df.groupby(df.A.eq('spec').cumsum()).apply(lambda x: x.duplicated()).values


array([False, False, False, False, False, False, False, False,  True,

        True,  True,  True,  True, False, False, False, False, False,

       False,  True,  True,  True,  True,  True])

由此,剩下的就是保留对应于“False”的那些行(即不重复)。


查看完整回答
反对 回复 2021-09-25
?
狐的传说

TA贡献1804条经验 获得超3个赞

另一个可能的解决方案可能是......您可以拥有一个计数器并从 A 列创建一个带有计数器值的新列,每当您在列值中遇到规范时,您就会增加计数器值。


counter = 0

def counter_fun(val):

    if val == 'spec': counter+=1

    return counter


df['new_col'] = df.A.apply(counter_fun)

然后在 new_col 上分组,并删除重复项。


查看完整回答
反对 回复 2021-09-25
  • 3 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信