根据逐列和行级别的比较,筛选Python Panda中不重复的记录



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

以下数据帧是根据Panda函数DataFrame.duplicated()生成的,基于"Loc"(groupby(和"Category",重复记录相应地标记为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"one_answers"IsDuplicate"创建另一列,以仅表示那些实际重复的值。只有虚假数据应标记为"不适用">

点数:

  1. 按位置分组

  2. 对于任何位置:

    a。如果"IsDuplicate"==True,则匹配"category"col并仅返回匹配的行作为True/False

    b。如果发现任何其他唯一的错误记录,则返回"不适用">

  3. 对于位置中的任何唯一False值,返回"不适用">

预期输出:

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     

如果需要更多的澄清,请告诉我。我感谢你的帮助。

您可以尝试创建两个条件,一个用于检查重复项,另一个用于获取按Loc和Category分组的列Category的出现次数,然后使用np.where分配计数大于1的duplicated()的结果,否则为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

最新更新