У меня есть набор данных, в котором мне нужно сгруппировать повторяющиеся записи, а затем посмотреть, была ли какая-либо группа помечена; если да, то мне нужно указать, что это отмечено в новом столбце.
Пример ввода; в столбце «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, кажется, правильно разбивает их на части, но я не могу понять, как затем применить «Если-то» к каждой группе, чтобы присвоить значение новому столбцу.
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 Хорошо, я неправильно понял требования. Если вам нужно, чтобы какая-либо группа, хотя бы одна строка которой была отмечена как True
, была помечена как True
в новом столбце, вам просто нужна первая строка с transform
и any
. Смотрите мой обновленный ответ с новым примером, где CCC помечен как True
.
Эффективным подходом было бы 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
Успешно справился; Я также ценю объяснение того, почему это сработало, и двухэтапный подход, который помог мне учиться. Очень ценно, спасибо!
Можете ли вы предоставить ожидаемый результат так же, как и для ввода?