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

Pandas按gsm_ID分组生成PreviousEventTime列失效问题求助

解决按gsm_ID分组生成上一事件时间的问题

首先咱们先揪出你代码里的核心问题:你用了shift(-1),这个方法是取当前行的后一行数据,但你的需求是获取上一行的eventdatetime,所以方向搞反啦,应该用shift(1)才对。另外,每组首行需要用matchdatetime填充的需求,也得额外做一步处理。

分步解决方案

1. 纠正shift方向,生成基础上一事件时间列

先按gsm_id分组,用shift(1)获取每组内上一行的eventdatetime,这时候每组首行的结果会是NaN:

eventdata['PreviousEventTime'] = eventdata.groupby(['gsm_id'])['eventdatetime'].shift(1)

2. 填充每组首行的matchdatetime

接下来把每组首行的NaN替换成对应组的matchdatetime,这里给你两种实用方法:

  • 方法一:用fillna结合transform(简洁高效)
    eventdata['PreviousEventTime'] = eventdata['PreviousEventTime'].fillna(
        eventdata.groupby(['gsm_id'])['matchdatetime'].transform('first')
    )
    
  • 方法二:逐组apply处理(逻辑更直观,适合调试)
    def fill_previous_time(group):
        group['PreviousEventTime'] = group['eventdatetime'].shift(1)
        # 把组内首行的NaN替换为当前组的matchdatetime
        group.loc[group.index[0], 'PreviousEventTime'] = group['matchdatetime'].iloc[0]
        return group
    
    eventdata = eventdata.groupby(['gsm_id'], group_keys=False).apply(fill_previous_time)
    

为什么你之前的代码只第一个组“生效”?

你用shift(-1)是取后一行数据,当组内只有一行时会得到NaN,多组数据的话,后续行的结果会是下一行的时间,完全不符合你的需求。所谓的“第一个组生效”大概率是巧合(比如第一个组只有一行,或者你误判了结果),纠正shift方向后这个问题就会消失。

验证结果的小技巧

你可以挑一个有多个事件的gsm_id单独查看,确认结果是否符合预期:

# 替换成你数据里的某个测试gsm_id
sample_group = eventdata[eventdata['gsm_id'] == 'test_gsm_id']
print(sample_group[['gsm_id', 'eventdatetime', 'PreviousEventTime']])

内容的提问来源于stack exchange,提问作者Zephyr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:24:58