Выявляйте и отмечайте дубликаты, каждый из которых имеет определенное качество

У меня есть набор данных, в котором мне нужно сгруппировать повторяющиеся записи, а затем посмотреть, была ли какая-либо группа помечена; если да, то мне нужно указать, что это отмечено в новом столбце.

Пример ввода; в столбце «Concat» я ищу дубликаты:

Customer_Reference  Auth_ID Concat  Flag
C001    A1234   AAA TRUE
C002    A758    AAA FALSE
C003    A6149   BBB FALSE
C004    A5271   CCC FALSE
C005    A0124   BBB FALSE

Поведение, которое я ищу, заключается в том, что «AAA» является дубликатом, где хотя бы один из них имеет флаг «TRUE»; поэтому оно должно быть помечено как «ИСТИНА» в столбце (подлежит добавлению).

Мне удалось пометить повторяющиеся записи, и функция groupby, кажется, правильно разбивает их на части, но я не могу понять, как затем применить «Если-то» к каждой группе, чтобы присвоить значение новому столбцу.

🤔 А знаете ли вы, что...
Python имеет богатую стандартную библиотеку, включая модули для работы с текстом, файлами и сетями.


1
60
2

Ответы:

IIUC, создайте groupby и transform, где каждая группа значений в 'Concat' имеет хотя бы одну строку с True в 'Flag':

data = {
    "Customer_Reference": ["C001", "C002", "C003", "C004", "C005"],
    "Auth_ID": ["A1234", "A758", "A6149", "A5271", "A0124"],
    "Concat": ["AAA", "AAA", "BBB", "CCC", "BBB"],
    "Flag": [True, False, False, True, False],
}

df = pd.DataFrame(data)

df["Dup"] = df.groupby("Concat")["Flag"].transform(any)
  Customer_Reference Auth_ID Concat   Flag    Dup
0               C001   A1234    AAA   True   True
1               C002    A758    AAA  False   True
2               C003   A6149    BBB  False  False
3               C004   A5271    CCC   True   True
4               C005   A0124    BBB  False  False

Решено

Эффективным подходом было бы drop_duulates , чтобы сохранить только строки с множественным появлением «Concat», а затем выбрать те, у которых есть True «Flag» с isin.

keep = df.drop_duplicates('Concat').query('Flag')['Concat']
# ['AAA']

df['New'] = df['Concat'].isin(keep)

В качестве однострочника:

df['New'] = df['Concat'].isin(df.drop_duplicates('Concat')
                                .query('Flag')['Concat'])

Выход:

  Customer_Reference Auth_ID Concat   Flag    New
0               C001   A1234    AAA   True   True
1               C002    A758    AAA  False   True
2               C003   A6149    BBB  False  False
3               C004   A5271    CCC  False  False
4               C005   A0124    BBB  False  False

Промежуточные продукты:

# df.drop_duplicates('Concat')
  Customer_Reference Auth_ID Concat   Flag    New
0               C001   A1234    AAA   True   True
2               C003   A6149    BBB  False  False
3               C004   A5271    CCC  False  False

# df.drop_duplicates('Concat').query('Flag')
  Customer_Reference Auth_ID Concat  Flag   New
0               C001   A1234    AAA  True  True


# df.drop_duplicates('Concat').query('Flag')['Concat']
0    AAA
Name: Concat, dtype: object

Интересные вопросы для изучения