我有一个包含人员和工作的日期范围,其中与工作相关的单位全年都可以更改。如何过滤小于该人员和职位的报告日期列的最大单位日期?
我的数据框如下:
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'])
答案 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