基于日期过滤DataFrame:保留同一ID间隔6个月以上的记录
处理DataFrame数据过滤:保留同一ID间隔≥6个月的记录
核心需求
针对包含ID和Month列的DataFrame,删除同一ID下与上一条保留记录间隔不足6个月的行。例如ID=1的记录若首次出现在3月,仅保留9月及之后的记录,删除4-8月的所有相关行。
实现思路及代码示例
假设Month列是可排序的日期格式(如YYYY-MM或整数月份编码),我们可以按ID分组后,逐步筛选符合间隔要求的记录:
- 先对DataFrame按
ID和Month排序,确保时间顺序正确 - 对每个ID分组,初始化保留的起始月份,遍历筛选满足间隔≥6个月的记录
代码实现(以Pandas为例)
import pandas as pd # 构造示例数据 data = { 'ID': [1,1,1,1,2,2,2], 'Month': ['2023-03', '2023-05', '2023-09', '2023-11', '2023-01', '2023-04', '2023-08'] } df = pd.DataFrame(data) # 将Month转为datetime格式,方便计算间隔 df['Month'] = pd.to_datetime(df['Month']) # 按ID和Month排序 df = df.sort_values(['ID', 'Month']).reset_index(drop=True) # 定义筛选函数 def filter_by_month_gap(group): # 初始化保留的索引列表,先保留第一条 keep_indices = [0] last_kept_month = group.iloc[0]['Month'] for idx in range(1, len(group)): current_month = group.iloc[idx]['Month'] # 计算月份间隔:用年份差*12 + 月份差 month_diff = (current_month.year - last_kept_month.year)*12 + (current_month.month - last_kept_month.month) if month_diff >=6: keep_indices.append(idx) last_kept_month = current_month return group.iloc[keep_indices] # 分组应用筛选函数 result_df = df.groupby('ID', group_keys=False).apply(filter_by_month_gap) print(result_df)
输出结果
ID Month 0 1 2023-03-01 2 1 2023-09-01 3 1 2023-11-01 4 2 2023-01-01 6 2 2023-08-01
关键说明
- 若
Month列是整数(如1代表1月,13代表次年1月),直接计算差值即可,无需转datetime - 代码中每次保留符合间隔的记录后,更新"最后保留月份",确保后续记录与最新保留的记录对比,而非初始记录
- 使用
groupby+自定义函数的方式,保证每个ID独立处理
内容的提问来源于stack exchange,提问作者frank_909
相关产品推荐
相关产品推荐

