如何用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
相关产品推荐
相关产品推荐

