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

Pandas按条件将DataFrame行首非零值前的数值填充为NaN

实现步骤

你可以用pandas的向量化操作高效实现需求,不需要逐行循环,具体代码如下:

import pandas as pd
import numpy as np

# 1. 构造示例数据(你实际使用时替换成自己的DataFrame即可)
df = pd.DataFrame({
    'id': [1, 2, 3],
    'val_week1': [0, 1, 0],
    'val_week2': [0, 0, 0],
    'val_week3': [3, 0, 0],
    'val_week4': [2, 2, 0],
    'val_week5': [0, 3, 1]
})

# 2. 提取所有数值列,排除id列
val_cols = df.columns.drop('id')
val_df = df[val_cols]

# 3. 构造替换掩码:标记每行第一个非零值之前的位置
mask = ~(val_df != 0).cummax(axis=1)

# 4. 把掩码对应位置替换为NaN
df.loc[:, val_cols] = val_df.mask(mask, np.nan)

# 输出结果验证
print(df)

逻辑说明

  1. val_df != 0 会生成布尔矩阵,非零值的位置标记为True
  2. 按行做累积最大值cummax(axis=1):一旦某行出现第一个True,后续所有位置都会保持True,正好覆盖「第一个非零值及之后的所有列」
  3. 对上述结果取反后,True对应的就是「第一个非零值之前的列」,也就是我们需要替换为NaN的位置
  4. 最后调用mask方法完成批量替换即可

如果你遇到全零行的特殊情况,上述逻辑会把整行数值都替换为NaN,如果有其他处理需求可以基于这个框架调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:15:01