python - 如果另一个 Python pandas 数据框中的两个日期之间的日期,则更新列
问题描述
这是我的 2 个数据框:df1
eid start_dt end_dt flag
1 2020-12-01 2020-12-07 0
1 2020-12-08 2020-12-15 0
1 2020-12-16 2020-12-23 1
2 2020-12-01 2020-12-07 0
df2
eid event_dt col1 col2
1 2020-12-01 . .
1 2020-12-09 . .
1 2020-12-17 . .
2 2020-12-02 . .
输出df。
- If in df1 and df2, the eids match AND event_dt is between start_dt,end_dt
-- add a new column
-- update the flag
输出数据帧 df 看起来像这样
eid event_dt col1 col2 flag
1 2020-12-01 . . 0
1 2020-12-09 . . 0
1 2020-12-17 . . 1
2 2020-12-02 . . 0
我该怎么做呢?
解决方案
尝试merge
并query
:
df2['flag'] = (df1.assign(idx=df1.index)
.merge(df2, on='eid', how='left')
.query('start_dt <= event_dt <= end_dt')
.set_index('idx')
['flag']
)
输出:
eid event_dt col1 col2 flag
0 1 2020-12-01 . . 0
1 1 2020-12-09 . . 0
2 1 2020-12-17 . . 1
3 2 2020-12-02 . . 0
更新:对于更大的数据集,上述方法可能会产生一个MemoryError
. 改用pd.merge_asof
:
df2['flag'] = (pd.merge_asof(df2.sort_values('event_dt'),
df1.assign(idx=df1.index).sort_values('end_dt'),
by='eid', left_on='event_dt',
right_on='start_dt')
.query('event_dt<=end_dt')
.set_index('idx')
['flag']
)
推荐阅读
- python - 撤消或重做选项创建opencv图像处理(Python)
- node.js - 均衡。GetOne 查询文本中具有 hasMany-association 的未知列
- ios - 解码后改变图像的方向
- c# - 如何在 Azure Web App 中禁用 web.config 重写规则?
- java - 为什么我的第二种方法的模拟会影响第一种方法?
- azure - 从 Azure 表存储中获取实体(限制 1)
- json - 无法使用 MasterPage 访问 webform aspx 中的隐藏字段值
- symfony - Symfony:扩展实体而不创建表
- blazor - 如何在 blazor Web 程序集中运行捆绑的 javascript 文件?
- php - SMTP 通知:在检查是否已连接时捕获到 EOF