Обнаружить дублированные группы с Pandas - PullRequest
1 голос
/ 29 февраля 2020

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

Day        Code Value
01/03/2020  A   10
01/03/2020  B   15
01/03/2020  C   20
02/03/2020  A   10
02/03/2020  B   15
02/03/2020  C   20
03/03/2020  A   10
03/03/2020  B   20
03/03/2020  C   20
04/03/2020  A   10
04/03/2020  B   15

Я хотел бы сгруппировать данные по дням. В этом примере день 02/03/2020 такой же, как 01/03/2020. Однако в 03.03.2020 значение B изменилось. Кроме того, в день 04/03/2020 код C исчез.

Первый подход, который я вижу, состоит в том, чтобы l oop через данные, фильтрующие набор данных по дню (a), и сравнить результат с часть предыдущего дня (b), проверяя, является ли a.equals(b) TRUE. Я знаю, что это работает, но это совсем не эффективно, поскольку подразумевает много нарезки.

Есть ли какая-либо операция group_by, которая могла бы выполнить задачу?

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

Мы можем использовать GroupBy.agg, затем удалить дубликаты с помощью duplicated:

dups = df.astype(str).groupby('Day').agg(''.join).duplicated()
df[~df['Day'].map(dups)]

           Day Code  Value
0   01/03/2020    A     10
1   01/03/2020    B     15
2   01/03/2020    C     20
6   03/03/2020    A     10
7   03/03/2020    B     20
8   03/03/2020    C     20
9   04/03/2020    A     10
10  04/03/2020    B     15
1 голос
/ 29 февраля 2020

Если я правильно вас понимаю, это один из способов отбросить дублированные дни, т. Е. Дни, чьи (Code, Value) пары точно совпадают с парами другого дня.

unstacked = df.set_index(['Day', 'Code']).unstack()
unstacked
           Value            
Code           A     B     C
Day                         
01/03/2020  10.0  15.0  20.0
02/03/2020  10.0  15.0  20.0
03/03/2020  10.0  20.0  20.0
04/03/2020  10.0  15.0   NaN

res = unstacked.drop_duplicates().stack().reset_index()               
res['Value'] = res['Value'].astype(int)
res
          Day Code  Value
0  01/03/2020    A     10
1  01/03/2020    B     15
2  01/03/2020    C     20
3  03/03/2020    A     10
4  03/03/2020    B     20
5  03/03/2020    C     20
6  04/03/2020    A     10
7  04/03/2020    B     15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...