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累计值加1df.mask(..., np.nan):将累计值大于1的位置(即首个0之后的所有位置)的值替换为NaN,非0值哪怕处于首个0之后也不会被误改,完全匹配需求
性能说明
该实现为pandas原生向量化运算,哪怕DataFrame达到数十万行、上百列的规模,运行速度也远快于apply逐行遍历、手写for循环的方案。处理后的结果直接传入绘图库时,NaN值会被自动跳过,不会出现连续0值把衰减曲线拖平的问题。
内容的提问来源于stack exchange,提问作者LostinSpatialAnalysis
相关产品推荐
相关产品推荐

