如何使用groupby按预定义条件获取分组字段的上一个值并填充列
错误原因
- 拼写错误:筛选条件里把
Grass拼成了Gress,会直接导致符合要求的行根本筛选不出来。 - 对
groupby返回值理解错误:df.groupby()操作返回的是GroupBy分组对象,不是普通DataFrame,该对象是按指定键分组后的容器,不会直接展示原列结构,所以你看不到HorseId列是正常现象,不是列真的消失了。 - 逻辑链路不完整:你单独在筛选出来的temp对象上操作,最后没有把计算结果回写到原表
featured_data的对应行,就算分组计算成功也实现不了需求。
正确实现方案
不需要单独拆分temp表,可以直接对原表的符合条件的行做赋值,代码如下:
# 定位符合条件的行,生成布尔掩码 mask = (featured_data['Track'] == 'Sha Tin') & (featured_data['Surface'] == 'Grass') # 对符合条件的行,按HorseId分组取FGrating的上一行值,直接赋值给对应行的New FGrating featured_data.loc[mask, 'New FGrating'] = featured_data[mask].groupby('HorseId')['FGrating'].shift(1)
如果你的数据没有按比赛时间先后排序,shift(1)取到的上一行不是实际的上一场比赛结果,可以先按HorseId+比赛时间字段排序后再执行上述代码。不符合条件的行原本默认值就是-1,不需要额外处理。
内容的提问来源于stack exchange,提问作者Bogdan Doicin
相关产品推荐
相关产品推荐

