python - 过滤最大日期小于另一个日期
问题描述
我有一个包含人员和工作的日期框架,其中与工作相关的单位可以全年变化。如何筛选小于该人员和职位的报告日期列的最大单位日期?
我的数据框如下所示:
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'])
解决方案
设置
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
推荐阅读
- docker - docker dns 在主机上使用自定义 dns 失败
- javascript - javascript将日期转换为本地时区
- python - 如何使用 sklearn 模型访问 API 端点?
- python - .delete() 不适用于从 signals.py Django 调用的记录
- api - .NET Core API 中的本地化
- javascript - Node.js/Gulp 中的多行正则表达式未捕获
- php - Laravel:缺少必需的参数(我想创建一个产品列表)
- python - 使用 python 存储 git 更改、切换分支、提交文件、切换回和撤消存储
- php - 使用 php 选择一些 csv 值以导出到 html 表中
- java - 使用路由数据源和 JdbcTemplate 启动多个数据库事务