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

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

Пример ввода; в столбце «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, кажется, правильно разбивает их на части, но я не могу понять, как затем применить «Если-то» к каждой группе, чтобы присвоить значение новому столбцу.

Можете ли вы предоставить ожидаемый результат так же, как и для ввода?

iBeMeltin 02.07.2024 17:38
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

Это отлично работало там, где в Concat были дубликаты, но не позволяло пометить записи без дубликатов (см. «хотя бы один» в условии задачи). Я попытался для начала сделать «Dup» копией «Flag», но ваш код перезаписывает ее. Можно ли изменить ваш код, чтобы он работал там, где был отмечен один экземпляр Concat?

brummie49 03.07.2024 09:10

@ brummie49 Хорошо, я неправильно понял требования. Если вам нужно, чтобы какая-либо группа, хотя бы одна строка которой была отмечена как True, была помечена как True в новом столбце, вам просто нужна первая строка с transform и any. Смотрите мой обновленный ответ с новым примером, где CCC помечен как True.

e-motta 03.07.2024 11:09
Ответ принят как подходящий

Эффективным подходом было бы 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

Успешно справился; Я также ценю объяснение того, почему это сработало, и двухэтапный подход, который помог мне учиться. Очень ценно, спасибо!

brummie49 03.07.2024 09:18

Другие вопросы по теме