python - 如何使用 pandas itertuples 比较两个数据帧之间的行?
问题描述
我有两个带有日期范围和 ID 号的数据框。每个 ID 号在每个数据帧中出现多次。我的目标是,对于数据框 A 中的每一行,在数据框 B 中找到具有匹配 ID 号的每一行。对于每个匹配项,我需要检查数据框 A 中行的日期是否在数据框 B 中行的日期范围内。如果它在任何日期范围内,则需要对其进行标记。日期是 datetime64,ID 是 int64。我打算使用 itertuples。数据示例如下。谢谢!
数据框 A
|ID |Visit date|Flag |
|-----|----------|------|
|111 |jan 3 2020| |
|222 |feb 3 2020| |
|222 |mar 2 2020| |
|333 |jan 3 2020| |
数据框 B
|ID |Start date |End date |
|-----|-----------|----------|
|111 |feb 1 2020 |feb 5 2020|
|111 |mar 1 2020 |mar 5 2020|
|222 |feb 1 2020 |feb 5 2020|
|333 |jan 1 2020 |jan 5 2020|
目标:
|ID |Visit date |Flag |
|-----|-----------|-------|
|111 |jan 3 2020 | false |
|222 |feb 3 2020 | true |
|222 |mar 2 2020 | false |
|333 |jan 3 2020 | true |
解决方案
# merge dfa and dfb by "ID"
dfn = pd.merge(dfa, dfb, on='ID', how='left')
# covert to datetime Series
for col in dfn.columns:
if 'date' in col:
dfn[col] = pd.to_datetime(dfn[col])
# judge
dfn['Flag'] = dfn['Visit date'].between(dfn['Start date'], dfn['End date'])
dfn.sort_values('Flag', inplace=True)
# drop duplicates
dfn.drop_duplicates(['ID', 'Visit date'], keep='last').sort_index()
输出:
ID Visit date Flag Start date End date
1 111 2020-01-03 False 2020-03-01 2020-03-05
2 222 2020-02-03 True 2020-02-01 2020-02-05
3 222 2020-03-02 False 2020-02-01 2020-02-05
4 333 2020-01-03 True 2020-01-01 2020-01-05
print(dfn)
ID Visit date Flag Start date End date
0 111 2020-01-03 False 2020-02-01 2020-02-05
1 111 2020-01-03 False 2020-03-01 2020-03-05
3 222 2020-03-02 False 2020-02-01 2020-02-05
2 222 2020-02-03 True 2020-02-01 2020-02-05
4 333 2020-01-03 True 2020-01-01 2020-01-05
推荐阅读
- permissions - 动态请求 Google Docs 插件的权限
- git - git --version 命令返回与实际安装的结果不同的结果
- f# - 从 IList 中删除空字符串或空白字符串
在 F# - c# - 在 C# 代码中连接的 HTML 下拉列表,在页面刷新后消失?
- postgresql - 得到一个错误 ERROR: schema ":schema" does not exist while select nextval of seq
- spring-batch - 春季批处理作业如何知道其已完成并在启动作业时收到通知
- ajax - 在 DataTables JQuery 启动 ASP NET 之前显示模式
- c++ - 如何高效地使用和处理 GPU 中的 AVRO 数据?
- python - 在 Keras 中为加权损失传递可训练参数,同时使用生成器作为输入
- python - Flask:参数错误 - devices() 没有参数(给定 3 个)