You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用小DataFrame的日期范围与列值过滤大DataFrame?

解决方法:用df2的PatId和日期范围过滤df1

要实现用df2中的PatId匹配,且df1的EntryDate落在对应PatId的EntryDate和ExitDate区间内的过滤需求,这里提供几种高效的pandas实现方案,适配不同规模的数据集:

第一步:统一日期格式(必做)

首先确保两个DataFrame的日期列都是datetime类型,否则字符串无法正确比较日期范围:

import pandas as pd

# 转换df1的日期列
df1['EntryDate'] = pd.to_datetime(df1['EntryDate'])
# 转换df2的日期列
df2['EntryDate'] = pd.to_datetime(df2['EntryDate'])
df2['ExitDate'] = pd.to_datetime(df2['ExitDate'])

方案一:合并+过滤(推荐大数据集)

利用pandas的merge做关联,再通过布尔索引筛选符合日期范围的记录,这种方法是向量化操作,效率极高,适合你的大df1:

# 按PatId合并两个DataFrame(只保留两边都有的PatId)
merged = pd.merge(df1, df2, on='PatId', how='inner')

# 筛选df1的EntryDate在df2的日期区间内的记录
filtered_df = merged[
    (merged['EntryDate_x'] >= merged['EntryDate_y']) & 
    (merged['EntryDate_x'] <= merged['ExitDate'])
]

# 如果需要保留df1的原始列,直接选取即可
filtered_df = filtered_df[df1.columns]

也可以用query方法简化筛选逻辑,代码更简洁:

filtered_df = merged.query(
    'EntryDate_x >= EntryDate_y and EntryDate_x <= ExitDate'
)[df1.columns]

方案二:字典映射+逐行检查(适合小数据集)

如果df1规模不大,或者需要更灵活的逻辑判断,可以先把df2的日期范围转成字典,再逐行检查:

# 构建PatId到日期范围的字典:key是PatId,value是包含EntryDate和ExitDate的字典
pat_date_map = df2.set_index('PatId')[['EntryDate', 'ExitDate']].to_dict('index')

# 定义过滤函数:检查当前行的PatId是否在字典中,且EntryDate在对应区间内
def is_in_range(row):
    pat_info = pat_date_map.get(row['PatId'])
    if not pat_info:
        return False
    return pat_info['EntryDate'] <= row['EntryDate'] <= pat_info['ExitDate']

# 应用过滤
filtered_df = df1[df1.apply(is_in_range, axis=1)]

⚠️ 注意:这个方法是逐行操作,对于超大df1来说效率会比方案一低,优先推荐方案一。

额外注意事项

  • 确保PatId列的类型一致(比如都是整数或字符串),否则合并时会出现匹配失败的情况;
  • 如果df2中有重复的PatId,合并后会产生多条匹配记录,可根据需求用drop_duplicates()去重;
  • 若需要保留df1中所有PatId(即使不在df2中),可以把merge的how参数改为left,然后筛选EntryDate_y不为空的记录。

内容的提问来源于stack exchange,提问作者spacemud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:36:15