【问题标题】:Filter rows in pandas dataframe by dynamically generated values (latest date)通过动态生成的值(最新日期)过滤熊猫数据框中的行
【发布时间】:2020-10-30 08:18:59
【问题描述】:

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

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

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

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

EDIT2:

对不起,我解释得很糟糕。如果我对以下数据集进行重复数据删除,我将获得 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

【问题讨论】:

  • df.loc[df['timestamp'].idxmax()] 为我工作,如果您有多个广告系列,您想要每个组中的唯一一个怎么办?如果第一部分回答了您的问题,请告诉我有一些骗子也可以链接
  • 我想要每个时事通讯的最大日期的所有电子邮件值。

标签: python pandas date duplicates filtering


【解决方案1】:

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

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

【讨论】:

  • 这里不需要申请——也完全不匹配SQL代码。
  • @Datanovice 同意不需要申请,但我一定错过了他当时的意思。
  • 你能解释一下'group by'在这里会做什么吗?
  • @travelsandbooks 您现在能否更深入地解释您的问题,以便在我们尝试解决它之前更好地理解它。在你上面的例子中,你怎么知道一封电子邮件是“新的”并且应该被整理出来?从显示的所有行中,是否应该只删除一个,因为该电子邮件是“新的”?
  • @travelsandbooks 下面的操作是否正确?在这种情况下,我可以在不使用 apply 的情况下找到解决方案。 df.groupby('Launch_name').apply(lambda x: x[x['Launch_date']==max(x['Launch_date'])]).reset_index(level = 'Launch_name', drop=True)跨度>
猜你喜欢
  • 2013-06-09
  • 1970-01-01
  • 2018-02-06
  • 2018-01-18
  • 1970-01-01
  • 2020-05-05
  • 2014-02-25
  • 1970-01-01
  • 2019-05-21
相关资源
最近更新 更多