Pandas如何实现DataFrame空值取后续第一个非空得分生成新列
原代码问题原因
你的原有代码逻辑存在两个核心错误:
- 循环中拿到的
point仅为当前行的Score值,point+1是对数值做加法,完全无法定位到下一行的Score数据 - 未实现向后遍历查找第一个非空得分的逻辑,空值判断也和Pandas默认的空值格式(NaN)不兼容
最优实现方案
Pandas内置的bfill()(向后填充)方法天生适配这个需求,一行代码即可完成:
import pandas as pd # 先把空字符串转为Pandas可识别的空值,如果你的原始空值已经是NaN可跳过这步 df['Score'] = df['Score'].replace('', pd.NA) # 向后填充空值,直接生成next_score列 df['next_score'] = df['Score'].bfill() # 如果需要处理末尾全空的情况(最后几轮都没有得分),可以加默认值填充,比如填0 # df['next_score'] = df['Score'].bfill().fillna(0)
循环实现逻辑(供原理参考)
如果你需要手动用循环实现核心逻辑,可以倒序遍历记录最近的得分值,效率远高于正向逐行向后查找:
import pandas as pd next_score = [] latest_score = None # 倒序遍历Score列 for score in reversed(df['Score']): # 判断当前行是否为有效得分(兼容空字符串和NaN两种空值格式) if pd.notna(score) and score != '': latest_score = score next_score.append(latest_score) # 倒序生成的列表要反转后才能匹配原行顺序 df['next_score'] = next_score[::-1]
内容的提问来源于stack exchange,提问作者Nicotops
相关产品推荐
相关产品推荐

