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

如何基于第二个DataFrame的起始日期过滤Pandas第一个DataFrame的对应行

实现步骤

第一步:统一日期列格式

首先需要把两个DataFrame的Date列转换为Pandas日期类型,避免字符串比较出现逻辑错误:

import pandas as pd

# 构造df1
data = {'ID':['A', 'A', 'A', 'A', 'A', 'B','B','B','B', 'C','C','C','C','C','C', 'D','D','D'],
    'Date':['2021-2-13', '2021-2-14', '2021-2-15', '2021-2-16', '2021-2-17', '2021-2-16', '2021-2-17', '2021-2-18', '2021-2-19',
           '2021-2-12', '2021-2-13', '2021-2-14', '2021-2-15', '2021-2-16','2021-2-17', '2021-2-14', '2021-2-15', '2021-2-16'],
   'Steps': [1000, 1200, 1500, 2000, 1400, 4000,3400, 5000,1000, 3500,4000,5000,5300,2000,3500, 5000,5500,5200 ]}
df1 = pd.DataFrame(data)

# 构造df2
data1 = {'ID':['A', 'B', 'C', 'D'],
    'Date':['2021-2-15', '2021-2-17', '2021-2-16', '2021-2-15']}
df2 = pd.DataFrame(data1)

# 转换日期格式
df1['Date'] = pd.to_datetime(df1['Date'])
df2['Date'] = pd.to_datetime(df2['Date'])

第二步:过滤符合要求的行

有两种常用实现方式,按需选择即可:

方式1:映射法(代码更简洁,性能更高)

把df2中ID和起始日期的对应关系做成映射字典,直接在df1中匹配过滤:

# 构造ID-起始日期映射
id_start_map = df2.set_index('ID')['Date'].to_dict()
# 过滤行
result = df1[df1['ID'].map(id_start_map) <= df1['Date']]

方式2:关联过滤法(适合后续需要保留起始日期字段的场景)

先把两个表按ID关联,再按日期条件过滤,最后删掉多余的起始日期字段:

# 重命名df2的日期列避免冲突
df2 = df2.rename(columns={'Date': 'start_date'})
# 按ID关联两个表
df_merged = df1.merge(df2, on='ID', how='left')
# 过滤符合日期条件的行,删除多余字段
result = df_merged[df_merged['Date'] >= df_merged['start_date']].drop(columns='start_date')

以上两种方式输出的result就是符合要求的结果,会自动保留每个ID下日期大于等于对应起始日期的所有行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:36:04