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

Python中如何将DataFrame每行首个0之后的0替换为NaN

pandas按行保留首个0、后续0替换为NaN实现方案

核心思路是利用pandas按行累计计算的特性,全程不需要转置DataFrame,也不用写低效的逐行循环:逐行累计统计0的出现次数,所有累计0出现次数大于1的位置(也就是首个0之后的位置),对应位置的0替换为NaN即可。

完整实现代码

首先导入依赖、构造示例数据:

import pandas as pd
import numpy as np

# 构造示例输入DataFrame
df = pd.DataFrame(
    [
        [55, 34, 30, 29, 15, 0, 0],
        [63, 59, 49, 32, 21, 16, 0],
        [42, 24, 12, 5, 0, 0, 0],
        [25, 6, 0, 0, 0, 0, 0],
        [13, 0, 0, 0, 0, 0, 0]
    ],
    columns=list("ABCDEFG")
)

核心处理逻辑仅需1行:

df = df.mask(df.eq(0).cumsum(axis=1) > 1, np.nan)

处理后打印输出的结果和预期完全一致:

A   B   C     D     E     F    G
0  55  34  30  29.0  15.0   0.0  NaN
1  63  59  49  32.0  21.0  16.0  0.0
2  42  24  12   5.0   0.0   NaN  NaN
3  25   6   0   NaN   NaN   NaN  NaN
4  13   0 NaN   NaN   NaN   NaN  NaN

逻辑拆解

  • df.eq(0):生成和原DataFrame尺寸一致的布尔矩阵,值为0的位置标记为True(运算中等价于数值1),非0位置标记为False(运算中等价于数值0)
  • .cumsum(axis=1):按行方向(从A列到G列的顺序)做累计求和,每行第一个出现0的位置累计值为1,后续每多出现一个0累计值加1
  • df.mask(..., np.nan):将累计值大于1的位置(即首个0之后的所有位置)的值替换为NaN,非0值哪怕处于首个0之后也不会被误改,完全匹配需求

性能说明

该实现为pandas原生向量化运算,哪怕DataFrame达到数十万行、上百列的规模,运行速度也远快于apply逐行遍历、手写for循环的方案。处理后的结果直接传入绘图库时,NaN值会被自动跳过,不会出现连续0值把衰减曲线拖平的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:39:25