如何在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)
代码说明
- 提取目标列:
df.columns[1:]获取所有DAY开头的列,排除ID列; - 累积标记非零位置:
ne(0)将非零值转为True,0转为False;cumsum(axis=1)按行累加布尔值,第一个非零值之后的所有位置都会得到≥1的数值,而之前的位置保持0; - 替换目标值:
mask(non_zero_cumulative == 0)会把累积标记为0的位置的原值替换为NaN,精准匹配需求。
内容的提问来源于stack exchange,提问作者user026
相关产品推荐
相关产品推荐

