【问题标题】:De-duplicating a pandas data frame and taking the newest record对 pandas 数据框进行重复数据删除并获取最新记录
【发布时间】:2017-06-28 03:09:09
【问题描述】:

我有一个包含重复和更新日期的数据框。开始日期:

我正在寻找的是一种删除重复项并获取最新记录的方法。我知道 drop_duplicates() 但这只会删除 100% 相同的行。所以所需的输出看起来像:

我尝试过这样的事情:

grouped = df.groupby(['First Name', 'Middle Name','Last Name','Job Title','Active','Contractor'])
new_data = grouped['Update Date'].agg(np.max).to_frame().reset_index()

但必须有一种更好的方法来做到这一点,而不是按每列分组,然后取更新日期的最大值。 如果我想按某些列分组,并采用最大更新日期怎么办。但也采用其他未分组的列。

例如按名字、中间名和姓氏分组,仍然取最新记录的整个记录​​。

输入:

所需的输出。

谢谢!

【问题讨论】:

  • 最好有一个唯一标识每个人的密钥。我在这里假设第一个,中间和最后一个唯一标识这个人。如果有两个人同名或有人改名怎么办?你需要先考虑这些事情。
  • 无论哪种方式,我都需要找到一种方法来分组并获取最新记录
  • 如果您提供数据框的代码版本 (df = ....) 以便我们可以复制粘贴它,您将获得更快的响应以供将来参考。图片看起来很漂亮,但无助于获得像您这样的数据框。

标签: python pandas duplicates pandas-groupby


【解决方案1】:

drop_duplicates 接受 subset 参数:

ident_fields = ['First Name', 'Middle Name','Last Name']
df = (df.sort_values('Update Date')
      .drop_duplicates(subset=ident_fields, keep='last'))

【讨论】:

    【解决方案2】:

    尽管有我的评论,您可以先订购整个数据框,然后再取每个组的第一行。

    df = df.sort_values('Update Date', ascending=False)
    df.groupby(['First Name', 'Middle Name','Last Name']).first().reset_index()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-20
      • 2021-12-06
      相关资源
      最近更新 更多