You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决pandas使用pd.Grouper按ID聚合时日期变更或字段值缺失问题

实现方案

核心逻辑

只按ID字段分组,不要将Date放入分组键,避免pd.Grouper带来的日期修改、跨周期字段丢失问题:

  1. 先将Date转为日期格式,再按ID+Date升序排序,保证每组内记录按时间先后排列
  2. 分组聚合时单独指定规则: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:27:04