解决pandas使用pd.Grouper按ID聚合时日期变更或字段值缺失问题
实现方案
核心逻辑
只按ID字段分组,不要将Date放入分组键,避免pd.Grouper带来的日期修改、跨周期字段丢失问题:
- 先将
Date转为日期格式,再按ID+Date升序排序,保证每组内记录按时间先后排列 - 分组聚合时单独指定规则:
Date取每组第一条记录的值,其余字段取每组第一个非空有效值
完整代码
import pandas as pd import numpy as np # 初始化示例数据 NaN = np.nan data = { 'ID':['AAQRB','AAQRB','AAQRB', 'AHXSJ','AHXSJ','AHXSJ','GABOY','GABOY','GABOY','GHZGS','GHZGS','GHZGS'], 'Date':['10/18/2021 10:52:53 PM','10/18/2021 10:53:55 PM', '10/25/2021 5:55:43 PM', '10/22/2021 10:37:06 PM','10/22/2021 10:38:22 PM','10/22/2021 10:39:56 PM', '11/1/2021 1:27:15 AM','11/1/2021 1:28:45 AM','11/2/2021 8:53:39 PM', '10/29/2021 11:13:57 PM', '10/29/2021 11:17:47 PM', '10/29/2021 11:19:15 PM'], 'Race_x':[NaN,NaN,NaN,NaN,NaN,1,NaN,NaN,1, NaN,NaN,1], 'Vaccine':['TRUE',NaN,NaN,'TRUE',NaN,NaN,'TRUE',NaN,NaN,'FALSE',NaN,NaN], 'Study_activity': [NaN,'continue',NaN,NaN,'continue',NaN,NaN,'continue',NaN,NaN,'continue',NaN], 'Who_Contacted': [NaN,NaN,'WeContacted',NaN,NaN,'WeContacted',NaN,NaN,NaN,NaN,NaN,'WeContacted']} test_df = pd.DataFrame(data) # 预处理:转换日期格式 + 按ID+时间升序排序 test_df['Date'] = pd.to_datetime(test_df['Date']) test_df = test_df.sort_values(by=['ID', 'Date'], ascending=True).reset_index(drop=True) # 构造聚合规则:Date取首条,其余字段取第一个非空值 agg_config = {'Date': 'first'} for col in test_df.columns: if col not in ['ID', 'Date']: agg_config[col] = lambda x: x.loc[x.first_valid_index()] if x.first_valid_index() is not None else np.nan # 执行分组聚合 baseline_df = test_df.groupby('ID').agg(**agg_config).reset_index()
原代码问题说明
你之前的实现将pd.Grouper生成的日期周期放入了分组键,相当于把同一个ID的记录按天/月/年拆成了多个子分组,自然会出现跨周期的字段值丢失,或者日期被替换为周期锚点(月末/年末日期)的问题,去掉分组键中的日期维度,单独对Date字段指定取首条规则即可避免该问题。
内容的提问来源于stack exchange,提问作者Shiva
相关产品推荐
相关产品推荐

