求助:从数据集提取按id分组且日期间隔超一年的最高code记录
需求与解决方案
原始数据集
| id | code | date |
|---|---|---|
| 1 | 39 | 20180527 |
| 1 | 17 | 20180223 |
| 1 | 17 | 20180223 |
| 1 | 17 | 20180223 |
| 1 | 30 | 20120612 |
| 1 | 14 | 20120214 |
| 2 | 40 | 20210605 |
| 2 | 32 | 20210412 |
| 2 | 25 | 20210315 |
| 3 | 39 | 20170504 |
| 3 | 17 | 20170205 |
| 3 | 40 | 20150506 |
提取规则
- 按
id分组,date越大优先级越高 - 过滤重复记录:同一
id下同一code的重复行只保留最新日期的一条 - 从高优先级(最新日期)开始筛选,保留与上一条保留记录的日期间隔超过一年的条目
期望输出
| id | code | date |
|---|---|---|
| 1 | 39 | 20180527 |
| 1 | 30 | 20120612 |
| 2 | 40 | 20210605 |
| 3 | 39 | 20170504 |
| 3 | 40 | 20150506 |
当前代码的问题
你尝试的代码仅能获取每个id组的最大日期条目,无法满足间隔筛选的需求:
latest_dates = column_selection.groupby("id").max() # group the data by id and get the max date for each group latest_dates = latest_dates.reset_index() # reset the index latest_dates # print the latest date for each ID with the new index
输出结果仅保留了每组的最新一条:
| id | code | date |
|---|---|---|
| 1 | 39 | 20180527 |
| 2 | 40 | 20210605 |
| 3 | 39 | 20170504 |
解决方案步骤
- 去重处理:按
id和code分组,保留每个组合的最大date,去除重复行 - 日期格式转换:将
date列转为datetime类型,方便计算时间间隔 - 按日期排序:每个
id组内按date降序排列,确保从最新记录开始筛选 - 间隔筛选:遍历每个组,只保留与上一条保留记录间隔超过一年的条目
完整代码实现
import pandas as pd # 假设原始数据存储在DataFrame column_selection中 # 步骤1:去重,保留每个id+code组合的最大date unique_data = column_selection.groupby(['id', 'code'])['date'].max().reset_index() # 步骤2:将date转为datetime类型 unique_data['date'] = pd.to_datetime(unique_data['date'], format='%Y%m%d') # 步骤3:按id分组,每组内按date降序排序 sorted_data = unique_data.sort_values(['id', 'date'], ascending=[True, False]) # 步骤4:筛选间隔超过一年的条目 def filter_year_interval(group): # 初始化结果列表,先加入最新记录 result = [group.iloc[0]] # 遍历后续行 for idx in range(1, len(group)): current_row = group.iloc[idx] last_kept_date = result[-1]['date'] # 判断时间间隔是否超过一年(365天) if (last_kept_date - current_row['date']).days > 365: result.append(current_row) return pd.DataFrame(result) # 应用筛选函数到每个id组 final_result = sorted_data.groupby('id').apply(filter_year_interval).reset_index(drop=True) # 可选:将date转回原字符串格式 final_result['date'] = final_result['date'].dt.strftime('%Y%m%d') print(final_result)
代码说明
- 去重阶段:通过
groupby(['id', 'code'])['date'].max()确保同一id下的同一code只保留最新日期的记录 - 日期转换:使用
pd.to_datetime将字符串日期转为可计算的datetime对象,便于时间差判断 - 排序逻辑:降序排序保证从最新记录开始筛选,符合优先级要求
- 间隔筛选:自定义函数遍历每个组,只保留与上一条保留记录间隔超过365天的条目,完全匹配需求
内容的提问来源于stack exchange,提问作者Sukrut Shishupal
相关产品推荐
相关产品推荐

