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)
逻辑说明
val_df != 0会生成布尔矩阵,非零值的位置标记为True- 按行做累积最大值
cummax(axis=1):一旦某行出现第一个True,后续所有位置都会保持True,正好覆盖「第一个非零值及之后的所有列」 - 对上述结果取反后,
True对应的就是「第一个非零值之前的列」,也就是我们需要替换为NaN的位置 - 最后调用
mask方法完成批量替换即可
如果你遇到全零行的特殊情况,上述逻辑会把整行数值都替换为NaN,如果有其他处理需求可以基于这个框架调整。
内容的提问来源于stack exchange,提问作者HKedia
相关产品推荐
相关产品推荐

