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

如何在DataFrame行首替换0为NaN直到遇到非零值?

问题描述

给定如下DataFrame:

import pandas as pd

df = pd.DataFrame({"ID":["A","B","C","C","D"],
                   "DAY 1":[0, 0, 4, 0, 8],
                   "DAY 2":[3, 0, 4, 1, 2],
                   "DAY 3":[0, 2, 9, 9, 6],
                   "DAY 4":[9, 2, 4, 5, 7]})

原始数据输出:

ID  DAY 1  DAY 2  DAY 3  DAY 4
0  A      0      3      0      9
1  B      0      0      2      2
2  C      4      4      9      4
3  C      0      1      9      5
4  D      8      2      6      7

需求:对每一行,将第一个非零值之前的所有行首连续0值替换为NaN,ID列不参与此规则。注意:第一个非零值之后出现的0需要保留(比如行0的DAY 3列的0)。期望输出:

ID  DAY 1  DAY 2  DAY 3  DAY 4
0  A    nan      3      0      9
1  B    nan    nan      2      2
2  C      4      4      9      4
3  C    nan      1      9      5
4  D      8      2      6      7
实现方案

可以利用pandas的逐行累积计算和掩码功能实现,代码如下:

import numpy as np

# 提取需要处理的列(排除ID)
day_columns = df.columns[1:]

# 对每行计算非零值的累积标记:第一个非零值前的位置累积和为0,之后的≥1
non_zero_cumulative = df[day_columns].ne(0).cumsum(axis=1)

# 将累积标记为0的位置(即第一个非零前的0)替换为NaN
df[day_columns] = df[day_columns].mask(non_zero_cumulative == 0)

# 查看结果
print(df)

代码说明

  1. 提取目标列:df.columns[1:]获取所有DAY开头的列,排除ID列;
  2. 累积标记非零位置:ne(0)将非零值转为True,0转为False;cumsum(axis=1)按行累加布尔值,第一个非零值之后的所有位置都会得到≥1的数值,而之前的位置保持0;
  3. 替换目标值:mask(non_zero_cumulative == 0)会把累积标记为0的位置的原值替换为NaN,精准匹配需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:15:29