python - 使用较小的日期范围和列值过滤较大的 DataFrame
问题描述
我有一个更大的DataFrame
, df1
,看起来像这样:
Data
PatId EntryDate Id
725 2005-01-03 1422 X
2005-01-04 1563 X
2005-01-05 1355 X
2005-01-06 118 X
2005-01-09 1400 X
...
117785 2004-12-31 799998 X
2005-01-03 796833 X
2005-01-05 798728 X
2005-01-08 798545 X
2005-01-11 797632 X
还有一个更小DataFrame
的 ,df2
看起来像这样:
PatId
EntryDate ExitDate
2005-01-15 2005-04-15 22407
2005-01-30 2005-04-30 95938
2005-02-07 2005-05-07 116812
2005-02-18 2005-05-18 12163
2005-02-21 2005-05-21 22908
我想要一种优雅的过滤方式df1
,只包含PatId
位于EntryDate
和中的ExitDate
索引之间的行df2
。
解决方案
您可以将两个 DataFrame 合并在一起,PatId
这会将进入和退出日期带到 df1 ,然后您只需要使用日期时间比较来过滤它。我还重置了您拥有的索引并在最终显示中摆脱了辅助列,但是做您想做的。
举个例子:
import pandas as pd
df1 = pd.DataFrame({'PatId': [725, 725, 725, 725, 117785, 117785],
'EntryDate': ['2005-01-03', '2005-01-04', '2005-01-05', '2005-01-06',
'2004-12-31', '2005-01-03'],
'Id': [1422, 1563, 1355, 118, 7999998, 796833],
'Data': ['X','X','X','X','X','X']})
df1['EntryDate'] = pd.to_datetime(df1.EntryDate)
df1.set_index(['PatId', 'EntryDate', 'Id'])
df2 = pd.DataFrame({'PatId': [725, 117785],
'EntryDate': ['2005-01-04', '2005-01-02'],
'ExitDate': ['2005-01-05', '2006-01-18']})
df2['EntryDate'] = pd.to_datetime(df2.EntryDate)
df2['ExitDate'] = pd.to_datetime(df2.ExitDate)
df2.set_index(['EntryDate', 'ExitDate'])
这是实际的代码:
df = df1.reset_index().merge(df2.reset_index(), on='PatId', how='left', suffixes=['','_1'])
(df[(df.EntryDate >= df['EntryDate_1']) & (df.EntryDate <= df.ExitDate)]
.drop(columns=['EntryDate_1', 'ExitDate'])
.set_index(['PatId', 'EntryDate', 'Id']))
Data
PatId EntryDate Id
725 2005-01-04 1563 X
2005-01-05 1355 X
117785 2005-01-03 796833 X
推荐阅读
- javascript - 如何在 for 循环中使用 javascript queryselectorall 移动所有图像?
- android - BLE Android如何传递特征以在片段中使用
- questdb - 如何在 QuestDB docker 容器中保存数据?
- varnish - 为什么在 customexec.config(清漆缓存)中定义了两次“ExecStart=”?
- cognos - 如何为不同的电子邮件接收者生成 Cognos 报告?
- javascript - Javascript 文件由 eslintrc.json 自动更改
- html - jQuery 函数需要单击两次才能运行但希望第一个 div 可见
- r - 如何找到乘以固定乘积的所有可能的向量组合?
- apache-kafka - 即使达到 batch.size,Kafka 生产者也不会发送消息
- typescript - 在 TypeScript 中提取一个属性的平面嵌套对象数组