Отфильтровать недублирующиеся записи в Python - pandas на основе сравнения по столбцам и строкам - PullRequest
0 голосов
/ 09 июля 2020

Это сложная проблема, и я не могу в этом разобраться, и я очень ценю вашу помощь в этом.

Приведенный ниже фрейм данных генерируется из pandas функции DataFrame.duplicated() на основе Повторяющиеся записи 'Lo c' (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

Я ожидаю создать еще один столбец на основе 'Lo c' (groupby) , «Категория» и «IsDuplicate» для представления только тех значений, которые фактически повторяются. Только ложные данные должны быть помечены как «Неприменимо»

Баллы:

  1. Местоположение Groupby

  2. Для любого местоположения:

    а. если 'IsDuplicate' == True, тогда сопоставить столбец 'category' и вернуть только совпадающие строки как True / False

    b. если найдена какая-либо другая только ложная запись, вернуть 'Not Applicable'

  3. Для любого только значения False в местоположении вернуть 'Not Applicable'

Ожидаемый результат:

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     

Пожалуйста, дайте мне знать, если требуются дополнительные разъяснения. И я благодарю вас за вашу помощь.

1 Ответ

1 голос
/ 09 июля 2020

Вы можете попробовать создать 2 условия: 1 для проверки дубликатов, а другое - для отсутствия появления столбцов Категория, сгруппированных по Lo c и Категория, а затем, используя 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')

Или аналогичные logi c, но объединяя их в цепочку преобразований:

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
...