Pandas按ID分组补全DataFrame日期间隔并生成缺失标记、研究日新列
解决方案
实现思路
- 首先将日期列转换为pandas支持的datetime格式,方便日期范围计算
- 按ID分组,生成每个ID从最早到最晚日期的完整连续日期序列
- 关联原始数据表,补全缺失的日期行,同时标记日期是否为补充的缺失值
- 按ID分组按日期排序后,生成自增的study_day序列
完整可运行代码
import pandas as pd # 原始数据构造 data = {'ID':['A', 'A', 'A','A', 'B', 'B', 'B', 'B', 'C', 'C'], 'Date':['03/25/2021', '03/25/2021','03/27/2021', '03/29/2021', '03/10/2021','03/11/2021','03/15/2021','03/16/2021', '03/21/2021','03/25/2021']} df = pd.DataFrame(data) # 1. 转换日期列为datetime格式 df['Date'] = pd.to_datetime(df['Date']) # 2. 生成每个ID的完整日期序列 id_date_range = df.groupby('ID')['Date'].agg(['min', 'max']).reset_index() full_date_df = id_date_range.apply( lambda x: pd.Series(pd.date_range(x['min'], x['max'], freq='D'), name='Date'), axis=1 ).stack().reset_index(level=1, drop=True).reset_index(name='Date').merge( id_date_range[['ID']], on='index' ).drop('index', axis=1) # 3. 关联原始数据补全行,标记missing_date ## 先给原始数据加存在标记 df['_exist'] = 0 ## 合并完整日期表和原始表 result = full_date_df.merge(df, on=['ID', 'Date'], how='left') ## 缺失日期标记:存在标记为空则为缺失,值为1,否则为0 result['missing_date'] = result['_exist'].isna().astype(int) result = result.drop('_exist', axis=1) # 4. 生成study_day列,每个ID从1开始按天递增 result = result.sort_values(['ID', 'Date'], ignore_index=True) result['study_day'] = result.groupby('ID').cumcount() + 1 print(result)
输出示例(部分)
ID Date missing_date study_day 0 A 2021-03-25 0 1 1 A 2021-03-25 0 1 2 A 2021-03-26 1 2 3 A 2021-03-27 0 3 4 A 2021-03-28 1 4 5 A 2021-03-29 0 5 6 B 2021-03-10 0 1 7 B 2021-03-11 0 2 8 B 2021-03-12 1 3 ...
内容的提问来源于stack exchange,提问作者shiva kumar
相关产品推荐
相关产品推荐

