Фильтровать строки в pandas кадре данных по динамически сгенерированным значениям (последняя дата) - PullRequest
0 голосов
/ 09 июля 2020

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

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

Я пытался отсортировать по дате по убыванию, а затем исключить дубликаты и сохранить первое значение.

df = df.sort_values('timestamp',ascending=False)
df = df.drop_duplicates(subset='newsletter_type','newsletter_name','email'],keep="first")

Потому что это позволит сохранить самый последний запуск и избавиться от остальных. Однако я понял, что если пользователь отменил подписку, десять информационных бюллетеней запускают go, моя программа увидит это как «новый» адрес электронной почты и сохранит его.

Есть хороший способ сделать это? «Говоря» псевдо-SQL, я бы в основном хотел сказать

SELECT newsletter_type, newsletter_name, email FROM dataset WHERE launch_date = MAX(launch_date).

EDIT: образец данных. Мне не нужна нижняя строка, но поскольку это электронное письмо не было раньше для этого newsletter_name, de-dupe сохранит его. Я хочу знать, как указать pandas, чтобы сохранить выпуск «образца» информационного бюллетеня 09/07/2020, потому что он последний.

campaign_name   newsletter name newsletter type email_md5   timestamp
test5   sample  A   123@    09/07/2020
test5   sample  A   456@    09/07/2020
test5   sample  A   789@    09/07/2020
test5   sample  A   012@    09/07/2020
test5   sample  A   345@    09/07/2020
test5   sample  A   new@    08/07/2020

EDIT2:

Извините, я плохо объяснил . Если я устраню дублирующий набор данных ниже, я получу значения 5 июля для количества адресов электронной почты = отлично, но также и abcde@hotmail адрес электронной почты = плохой.

Мне нужны строки информационного бюллетеня 05/07 для информационный бюллетень A и строки информационного бюллетеня 04/07 для информационного бюллетеня B. Я знаю, что количество адресов электронной почты будет отображаться в обоих вариантах newsletter_type.

Newsletter_type Launch_name Launch_date Email
            
A   5_July_newsletter   05/07/2020  12345@hotmail
A   5_July_newsletter   05/07/2020  67890@hotmail
A   5_July_newsletter   05/07/2020  55555@hotmail
A   1_January_newsletter    05/06/2020  12345@hotmail
A   1_January_newsletter    05/06/2020  67890@hotmail
A   1_January_newsletter    05/06/2020  55555@hotmail
A   1_January_newsletter    05/06/2020  abcde@hotmail
            
B   5_July_newsletter   04/07/2020  12345@hotmail
B   5_July_newsletter   04/07/2020  67890@hotmail
B   5_July_newsletter   04/07/2020  55555@hotmail
B   1_January_newsletter    04/06/2020  12345@hotmail
B   1_January_newsletter    04/06/2020  67890@hotmail
B   1_January_newsletter    04/06/2020  55555@hotmail
B   1_January_newsletter    04/06/2020  abcde@hotmail

1 Ответ

1 голос
/ 09 июля 2020

Я бы отсортировал по «дате запуска» и сгруппировал бы по «названию информационного бюллетеня» (если это уникальный тип, который нужно сохранить по одному на каждой странице). Это вернет только последнее время каждого уникального «новостного письма».

df = df.sort_values(by=['launch date']).groupby('newsletter name').first()
...