如何在指定ID分组内剔除间隔7天内的观测值?
问题描述
现有如下数据:
| ID | Date |
|---|---|
| 101 | 10-17-2021 |
| 101 | 10-19-2021 |
| 101 | 10-20-2021 |
| 101 | 10-31-2021 |
| 101 | 11-01-2021 |
需求:针对每个ID,剔除间隔7天内的观测值,保留该范围内最早的日期;持续处理至各ID日期间隔至少7天且无中间日期。示例中最终需保留10-17-2021和10-31-2021。
解决方案(Python pandas实现)
以下是基于pandas的高效处理代码:
import pandas as pd # 加载数据(实际场景可替换为读取文件逻辑) df = pd.DataFrame({ 'ID': [101, 101, 101, 101, 101], 'Date': ['10-17-2021', '10-19-2021', '10-20-2021', '10-31-2021', '11-01-2021'] }) # 转换日期为datetime类型,方便计算间隔 df['Date'] = pd.to_datetime(df['Date'], format='%m-%d-%Y') # 定义分组过滤函数 def filter_close_dates(group): # 先按日期排序 sorted_group = group.sort_values('Date') kept_dates = [] last_kept_date = None for current_date in sorted_group['Date']: if last_kept_date is None: # 保留组内第一个日期 kept_dates.append(current_date) last_kept_date = current_date else: # 计算与上一个保留日期的间隔天数 days_diff = (current_date - last_kept_date).days if days_diff >= 7: kept_dates.append(current_date) last_kept_date = current_date return sorted_group[sorted_group['Date'].isin(kept_dates)] # 按ID分组处理并重置索引 filtered_df = df.groupby('ID').apply(filter_close_dates).reset_index(drop=True) # 转换回原日期格式 filtered_df['Date'] = filtered_df['Date'].dt.strftime('%m-%d-%Y') # 输出结果 print(filtered_df)
处理结果
运行代码后得到的最终数据:
| ID | Date |
|---|---|
| 101 | 10-17-2021 |
| 101 | 10-31-2021 |
内容的提问来源于stack exchange,提问作者biostat_help
相关产品推荐
相关产品推荐

