【问题标题】:How do I return only the most recent rows in Pandas?如何仅返回 Pandas 中的最新行?
【发布时间】:2021-09-20 00:40:03
【问题描述】:

我正在处理候选人的工作申请,一些候选人提交了多个申请,我的目标是将数据集减少到每个候选人的最新申请。

我的代码如下:

import pandas as pd

data = {'application_date' : ["9/11/2020 10:30:31", "9/11/2020 11:07:59", "9/11/2020 11:09:02", "9/14/2020 13:14:31", "9/14/2020 13:15:15"],
        'candidate_id' : ["001", "002", "002", "002", "002"]
       }

df = pd.DataFrame(data)

df['application_date'] = pd.to_datetime(df['application_date'])

df['rank_application'] = df.groupby('candidate_id')['application_date'].rank(method='first')

这将返回以下内容:

     application_date candidate_id  rank_application
0 2020-09-11 10:30:31          001               1.0
1 2020-09-11 11:07:59          002               1.0
2 2020-09-11 11:09:02          002               2.0
3 2020-09-14 13:14:31          002               3.0
4 2020-09-14 13:15:15          002               4.0

这就是我卡住的地方。从这里我不知道如何只将df减少到每个candidate_id最近的。我最初希望按降序排序,然后弄清楚如何获取 rank_application = 1 的行(但我无法弄清楚)

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这是你需要的:

    import pandas as pd
    
    data = {'application_date' : ["9/11/2020 10:30:31", "9/11/2020 11:07:59", "9/11/2020 11:09:02", "9/14/2020 13:14:31", "9/14/2020 13:15:15"],
            'candidate_id' : ["001", "002", "002", "002", "002"]
           }
    
    df = pd.DataFrame(data)
    
    df['application_date'] = pd.to_datetime(df['application_date'], infer_datetime_format=True)
    
    result = df.iloc[df.groupby('candidate_id')['application_date'].agg(pd.Series.idxmax)]
    
    print(result)
    

    结果:

         application_date candidate_id
    0 2020-09-11 10:30:31          001
    4 2020-09-14 13:15:15          002
    

    .iloc[] 采用一系列索引来获取适当的行。可能需要pd.to_datetime 语句来强制application_date 成为pd.Series.idxmax 工作的合适日期时间格式。

    【讨论】:

    • 谢谢 当我尝试使用提供给我的数据集来实现这一点时,出现了一个我无法解决的问题。数据是来自 Google 工作表的 CSV 文件。数据与我的示例略有不同,因此我现在想要获取与 application_id 相关的最新调查提交。我使用了一些函数来删除包含空数据的行现在我收到以下错误:IndexError: indices are out-of-bounds and IndexError: positional indexers are out-of-bounds 我假设在删除时索引发生了一些事情带有空值的行。
    • 我认为您应该在删除行后重置索引。你可以在 pandas 中使用 reset_index()
    • 我建议编写一些示例代码并将其与一个新问题一起发布 - 我想你会得到答案,但这是一个与这个问题完全不同的问题,所以它值得自己的问题。
    【解决方案2】:

    首先,因为这是对时间数据的排序和选择,所以你应该将你的列转换为pandas date_time,以便pd.to_datetime在pandas上很好地操作。

    然后您可以通过选择df['application_date'].agg(pd.Series.idxmax) 的时间序列中的最大值来选择['application_date']。但是,由于您要查找不同 id 或 rank 的最新时间,因此您需要添加一个groupby 以帮助每个 id 的最大选择。

    df.groupby('candidate_id')['application_date'].agg(pd.Series.idxmax)
    

    如果您想选择申请日期:您可以通过iloc轻松索引它们

    df.iloc[df.groupby('candidate_id')['application_date'].agg(pd.Series.idxmax)]
    

    【讨论】:

      【解决方案3】:

      这个答案我有点晚了。我在寻找类似的东西时偶然发现了这篇文章。

      这是我在尝试查找最新记录时通常会做的事情。

      df['rank_application'] = df.groupby('candidate_id')['application_date'].rank(method='first', ascending=False)
      df = df[df.rank_application == 1]
      

      问题中发布的初始方法是我遵循的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多