首页 > 解决方案 > 通过动态生成的值(最新日期)过滤熊猫数据框中的行

问题描述

我有一个包含通讯类型、通讯名称、通讯发布日期和电子邮件的数据集。每次发布都会经过很多行,因为收到新闻稿发布的每个电子邮件地址都有自己的行。

所有时事通讯都至少发布一次,但有些时事通讯有多次发布。我想清理我的数据集,以便我只有每个时事通讯的最新发布。但是,每个时事通讯的“最近”日期是不同的。

我一直在尝试按日期降序排序,然后删除重复并保留第一个值。

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

因为这将保留最近的发布并摆脱其余的。但是,我意识到如果用户在之前发布的十个时事通讯中取消订阅,我的程序会将其视为“新”电子邮件地址并保留它。

有没有好的方法来做到这一点?'Speaking' in pseudo-SQL,我基本上想说一种方式

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

编辑:样本数据。我不想要最后一行,但由于之前没有看到此 newsletter_name 的电子邮件,因此重复数据删除将保留它。我想知道如何告诉 pandas 保留 2020 年 9 月 7 日发布的“样本”时事通讯,因为它是最新的。

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

编辑2:

对不起,我解释得很糟糕。如果我对以下数据集进行重复数据删除,我将获得 7 月 5 日的数字电子邮件地址值 = 好,但也得到 abcde@hotmail 电子邮件地址 = 坏。

我想要时事通讯 A 的 05/07 时事通讯行和时事通讯 B 的 04/07 时事通讯行。我知道数字电子邮件地址将出现在两个 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

标签: pythonpandasdateduplicatesfiltering

解决方案


我会按“发布日期”排序,并按“通讯名称”分组(如果这是一个想要保存每个前一个的唯一类型)。这将只返回每个唯一“新闻信”的迟到。

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

推荐阅读