过滤最大日期小于另一个日期

时间:2019-04-10 19:49:18

标签: python pandas

我有一个包含人员和工作的日期范围,其中与工作相关的单位全年都可以更改。如何过滤小于该人员和职位的报告日期列的最大单位日期?

我的数据框如下:

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'])

1 个答案:

答案 0 :(得分:1)

设置

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

最好不要在过滤器中使用lambda,而可以在此处使用基本比较运算符:

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