You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pandas/numpy如何实现带升序逻辑的前向填充(无需逐行遍历)

Pandas 非逐行遍历实现升序约束前向填充方案

需求说明

实现规则如下:

  • 禁止逐行遍历数据集,采用符合Pandas设计理念的向量化操作
  • 填充逻辑仅沿升序方向更新:当前位置值大于历史已填充基准值时才更新基准,小于基准值的非空值会被基准值覆盖
  • 空值(NaN)统一使用当前最新基准值填充,序列开头未出现第一个有效值前的连续空值保持NaN
  • 源数据中连续空值的长度无固定规律

示例输入

import pandas as pd
import numpy as np

df = pd.DataFrame()
df['test'] = np.nan,np.nan,1,np.nan,np.nan,3,np.nan,np.nan,2,np.nan,6,np.nan,np.nan
df['desired_output'] = np.nan,np.nan,1,1,1,3,3,3,3,3,6,6,6
print(df)

期望输出

test  desired_output
0    NaN             NaN
1    NaN             NaN
2    1.0             1.0
3    NaN             1.0
4    NaN             1.0
5    3.0             3.0
6    NaN             3.0
7    NaN             3.0
8    2.0             3.0
9    NaN             3.0
10   6.0             6.0
11   NaN             6.0
12   NaN             6.0

实现方案

直接使用Pandas内置的累计最大值方法cummax()搭配常规前向填充ffill()即可,全程为C层面实现的向量化操作,无Python层逐行循环,执行效率最高,代码最简洁:

df['output'] = df['test'].cummax().ffill()

原理说明

  • cummax()会计算从序列起始位置到当前位置的累计最大值,天然满足「仅遇到更大值才更新基准、更小值直接忽略」的升序约束逻辑
  • cummax()遇到NaN时会返回NaN,后续接ffill()即可将空值位置填充为当前最新的累计最大值
  • 序列开头第一个有效值之前的位置,cummax()返回值始终为NaN,ffill()不会对这部分无前置有效值的位置做填充,完全匹配需求

效果验证

执行上述代码后,输出结果与期望完全一致:

test  desired_output  output
0    NaN             NaN     NaN
1    NaN             NaN     NaN
2    1.0             1.0     1.0
3    NaN             1.0     1.0
4    NaN             1.0     1.0
5    3.0             3.0     3.0
6    NaN             3.0     3.0
7    NaN             3.0     3.0
8    2.0             3.0     3.0
9    NaN             3.0     3.0
10   6.0             6.0     6.0
11   NaN             6.0     6.0
12   NaN             6.0     6.0

内容的提问来源于stack exchange,提问作者bud fox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:09:28