根据groupby列和行级比较筛选Python中的非重复记录

2024-09-22 20:36:11 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个复杂的问题,我无法解决这个问题,我非常感谢你在这方面的帮助

下面的数据帧是根据'Loc'(groupby)和'Category'从pandas函数DataFrame.duplicated()生成的,重复记录被相应地标记为True/False

Number  Loc    Category        Date       IsDuplicate     
-----------------------------------------------------
1        A     jetski        01/01/2020       False
2        A     kayak         01/02/2020       False
3        A     jetski,kayak  01/04/2020       False
4        B     jetski        01/05/2020       False
5        B     jetski        01/07/2020       True
6        C     kayak         01/08/2020       False
7        C     kayak         01/09/2020       True
8        C     jetski        01/10/2020       False

我的期望是基于“Loc”(groupby)、“Category”和“IsDuplicate”创建另一个列,以仅表示实际重复的值。只有虚假数据才应标记为“不适用”

要点:

  1. 分组位置

  2. 任何地点:

    a。如果“IsDuplicate”==True,则匹配“category”列并仅将匹配行返回为True/False

    b。如果发现任何其他错误记录,请返回“不适用”

  3. 对于位置中的任何唯一假值,返回“不适用”

预期产出:

Number  Loc    Category       Date       IsDuplicate     Only_Dupes   
---------------------------------------------------------------------
1        A     jetski       01/01/2020    False         Not Applicable       
2        A     kayak        01/02/2020    False         Not Applicable       
3        A     jetski,kayak 01/04/2020    False         Not Applicable
4        B     jetski       01/05/2020    False         False          
5        B     jetski       01/07/2020    True          True           
6        C     kayak        01/08/2020    False         False           
7        C     kayak        01/09/2020    True          True           
8        C     jetski       01/10/2020    False         Not Applicable     

如果需要进一步澄清,请告诉我。我感谢你的帮助


Tags: 数据标记falsetruenumberpandasdatenot
1条回答
网友
1楼 · 发布于 2024-09-22 20:36:11

您可以尝试创建两个条件,一个用于检查重复项,另一个用于获取按Loc和Category分组的列类别的外观,然后使用np.where分配duplicated()的结果,其中计数大于1,否则Not Applicable

c1 = df.duplicated(['Loc','Category'])
c2 = df.groupby(['Loc','Category'])['Category'].transform('count').gt(1)
df['Only_Dupes'] = np.where(c2,c1,'Not Applicable')

或类似逻辑,但在转换中链接它们:

df['Only_Dupes'] = df.groupby(['Loc','Category'])['Category'].transform(lambda x: 
                          np.where(x.count()>1,x.duplicated(),'Not Applicable'))

print(df)

   Number Loc      Category  IsDuplicate      Only_Dupes
0       1   A        jetski        False  Not Applicable
1       2   A         kayak        False  Not Applicable
2       3   A  jetski,kayak        False  Not Applicable
3       4   B        jetski        False           False
4       5   B        jetski         True            True
5       6   C         kayak        False           False
6       7   C         kayak         True            True
7       8   C        jetski        False  Not Applicable

相关问题 更多 >