基于前一个非NaN值递加1的方式向前填充NaN值
解决方案:按递增规则填充DataFrame中的NaN值
要实现需求中的填充规则(非NaN值之后的NaN按前一个非NaN值逐行加1填充,开头的NaN保留),可以利用pandas的分组和向量化操作完成,无需循环:
实现代码
替换示例中####### Turn "df" into "desired_df" here #######部分的代码如下:
import pandas as pd # 标记非NaN值,生成分组ID:每个非NaN值及后续NaN为一组,开头NaN单独成组 mask = df['col'].notna() df['group'] = mask.cumsum() # 对每个分组执行递增填充逻辑 df['col'] = df.groupby('group')['col'].transform( lambda x: x.iloc[0] + x.reset_index(drop=True).index if not pd.isna(x.iloc[0]) else x ) # 删除临时分组列 df.drop('group', axis=1, inplace=True)
逻辑说明
- 分组标记:通过
notna()识别非NaN值,再用cumsum()生成分组ID。每遇到一个非NaN值,分组ID就递增,确保该非NaN值和后续所有NaN同属一组,开头的NaN会被分到ID为0的组。 - 分组填充:对每个分组,若分组的第一个值是有效数值(非NaN),则用该起始值加上组内每行的索引偏移量(
reset_index(drop=True).index),实现逐行加1的填充;若为开头的NaN分组,直接保留原数据。 - 清理临时列:删除用于分组的临时列,得到目标结果。
运行后执行assert语句即可验证结果与desired_df完全匹配。
内容的提问来源于stack exchange,提问作者wildcat89
相关产品推荐
相关产品推荐

