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
相关产品推荐
相关产品推荐

