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

如何用Python Pandas筛选包含指定起止日期的DataFrame数据

解决按ID筛选同时包含起止日期的分组数据

核心需求

筛选出同时拥有start_date和end_date记录的ID,并保留这些ID的全部数据(中间日期无需全覆盖)。比如示例中jim、sara的所有记录留用,bob因缺少起始日期数据被剔除。

正确实现代码

方法一:用groupby+transform批量判断

start_date = '01-01-19'
end_date = '02-28-19'
target_dates = {start_date, end_date}

# 对每个ID的日期集合做校验:是否包含全部目标日期
has_required_dates = df.groupby('ID')['Date'].transform(
    lambda dates: target_dates.issubset(dates)
)

# 筛选符合条件的所有行
dfin = df[has_required_dates]

方法二:先提取有效ID再过滤

start_date = '01-01-19'
end_date = '02-28-19'
target_dates = [start_date, end_date]

# 先找出所有出现过目标日期的ID,再取同时包含两个日期的ID交集
valid_ids = df[df['Date'].isin(target_dates)].groupby('ID').filter(
    lambda x: x['Date'].nunique() == 2
)['ID'].unique()

# 保留这些ID的全部数据
dfin = df[df['ID'].isin(valid_ids)]

原代码的问题说明

你写的df.loc[df.groupby('ID').Date.isin([start_date,end_date])]逻辑有误:它只是逐行判断日期是否在目标列表中,没有校验同一个ID是否同时包含两个日期,会导致两个问题:

  • 过滤掉ID下的非起止日期行
  • 可能保留只含其中一个日期的ID数据(比如只有start_date的ID)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 12:15:01