Pandas DataFrame按双规则分组条件填充列空值的实现问题
跑马地草地赛事上次评分字段填充方案
原有代码问题排查
你原先的实现使用了bfill(后向填充)逻辑,会用后续出现的跑马地草地赛事评分反向填充该马匹此前的空值记录,哪怕这些记录产生时马匹尚未参加过跑马地草地赛事,直接违反了第一条填充规则。
正确实现代码
只需要将后向填充替换为前向填充(ffill)即可匹配需求,pandas高版本可直接调用分组对象的ffill方法,无需嵌套lambda,执行效率更高:
# 逐马匹分组处理:先以前一次跑马地评分前向填充空值,剩余空值(未参赛过)统一填0 df['Last FGrating at Happy Valley Grass'] = df.groupby('HorseId')['Last FGrating at Happy Valley Grass'].ffill().fillna(0)
如果需要兼容旧版本pandas,也可以保留apply写法:
df['Last FGrating at Happy Valley Grass'] = df.groupby('HorseId')['Last FGrating at Happy Valley Grass'].apply( lambda x: x.ffill().fillna(0) )
逻辑匹配性说明
- 前向填充(
ffill)只会用该马匹已经产生的上一次跑马地草地赛事评分填充后续的空值记录,完全符合第二条间隔期填充规则 - 前向填充结束后剩余的空值,全部属于该马匹从未参加过跑马地草地赛事的记录,统一填充0正好匹配第一条规则
注意事项
执行填充前请确保DataFrame已经按赛事发生时间升序排序,前向填充的逻辑依赖正确的时间顺序才能得到准确结果。
内容的提问来源于stack exchange,提问作者Bogdan Doicin
相关产品推荐
相关产品推荐

