首页 > 解决方案 > 过滤最大日期小于另一个日期

问题描述

我有一个包含人员和工作的日期框架,其中与工作相关的单位可以全年变化。如何筛选小于该人员和职位的报告日期列的最大单位日期?

我的数据框如下所示:

person_id   report_date     position_no     unit_date   unit
1           10/1/2017       123456          9/1/2017    789
1           10/1/2017       123456          9/10/2017   657
2           10/1/2017       251566          8/1/2017    123
2           10/1/2017       251566          8/1/2016    123
1           10/1/2018       123456          1/1/2018    541
1           10/1/2018       123456          2/1/2018    365
2           10/1/2018       251566          12/1/2017   155
2           10/1/2018       251566          3/1/2018    355

这是我想要的输出:

person_id   report_date     position_no     unit_date   unit
1           10/1/2017       123456          9/10/2017   657
2           10/1/2017       251566          8/1/2017    123
1           10/1/2018       123456          2/1/2018    365
2           10/1/2018       251566          3/1/2018    355

我是使用带有过滤器的 lambda 的新手,我曾希望这样的事情会起作用,但它没有:

df.groupby(['person_id','report_date','position_no']).filter(lambda x: x['unit_date'].max() < x['report_date'])

标签: pythonpandas

解决方案


设置

df.report_date = pd.to_datetime(df.report_date)
df.unit_date = pd.to_datetime(df.unit_date)

最好不要将 lambdas 与过滤器一起使用,您可以在此处使用基本的比较运算符:

m = df['unit_date'] < df['report_date']
u = df.loc[m].groupby(['person_id', 'position_no', 'report_date'])['unit_date'].idxmax()

df.loc[u]

   person_id report_date  position_no  unit_date  unit
1          1  2017-10-01       123456 2017-09-10   657
5          1  2018-10-01       123456 2018-02-01   365
2          2  2017-10-01       251566 2017-08-01   123
7          2  2018-10-01       251566 2018-03-01   355

如果您希望订单与原始 DataFrame 匹配:

df.loc[u.sort_values()]

   person_id report_date  position_no  unit_date  unit
1          1  2017-10-01       123456 2017-09-10   657
2          2  2017-10-01       251566 2017-08-01   123
5          1  2018-10-01       123456 2018-02-01   365
7          2  2018-10-01       251566 2018-03-01   355

推荐阅读