Нахождение каких-либо различий в строках, сгруппированных по двум столбцам - PullRequest
0 голосов
/ 26 апреля 2020

Предположим, у меня есть фрейм данных, как показано ниже

id              date                   email        phone     country

john     2020-01-02 10:09:00.11     john@email       123         USA
john     2020-01-02 10:09:00.11     john@email       456         USA
john     2020-01-02 10:09:00.11     john@email       123         USA
tim      2019-01-08 04:06:00.10     tim@email        555         JAP
ben      2018-06-02 08:02:00.00     ben@email        999         MEX
ben      2018-06-02 08:02:00.00     neb@email        999         MEX
john     2017-06-02 08:02:00.00     john@email       456         USA

Что я хочу сделать, это взять каждую строку, где есть дубликаты между идентификатором и датой, и посмотреть, есть ли какие-либо различия, и создать новый столбец, указывающий, что, ЕСЛИ ИЗМЕНЕНИЕ не является электронной почтой.

Так что пример, чтобы лучше объяснить. Есть три строки для Джона, где дата совпадает (2020-01-02 10: 09: 00.11). В телефоне есть разница, где два - «123», а один - «456». В результате в новом столбце с именем diff значение будет TRUE для каждой строки.

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

Если для комбинированной записи идентификатора и даты, такой как tim или другая запись, существует только одна строка для Джона вывод - ЛОЖЬ.

Ниже показано, как будет выглядеть ожидаемый результат. Любая помощь будет принята с благодарностью. Особый случай, связанный с электронными письмами, действительно отталкивает меня.

id              date                   email        phone     country      diff

john     2020-01-02 10:09:00.11     john@email       123         USA        True
john     2020-01-02 10:09:00.11     john@email       456         USA        True
john     2020-01-02 10:09:00.11     john@email       123         USA        True
tim      2019-01-08 04:06:00.10     tim@email        555         JAP        False
ben      2018-06-02 08:02:00.00     ben@email        999         MEX        False
ben      2018-06-02 08:02:00.00     neb@email        999         MEX        False
john     2017-06-02 08:02:00.00     john@email       456         USA        False

1 Ответ

1 голос
/ 26 апреля 2020

давайте используем df.duplicated с keep=False, чтобы отметить все дубликаты.

df['diff'] = df.duplicated(subset=['id','date','email'],keep=False)


print(df)

     id                    date       email  phone country   diff
0  john 2020-01-02 10:09:00.110  john@email    123     USA   True
1  john 2020-01-02 10:09:00.110  john@email    456     USA   True
2  john 2020-01-02 10:09:00.110  john@email    123     USA   True
3   tim 2019-01-08 04:06:00.100   tim@email    555     JAP  False
4   ben 2018-06-02 08:02:00.000   ben@email    999     MEX  False
5   ben 2018-06-02 08:02:00.000   neb@email    999     MEX  False
6  john 2017-06-02 08:02:00.000  john@email    456     USA  False
...