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

如何用Pandas实现每行从首个非NaN值起将后续NaN替换为0

解决方案

针对每行从第一个非NaN数值开始,将后续NaN替换为0的需求,可以通过以下高效的向量式操作实现:

步骤1:构造示例数据

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Carol'],
    'day1': [np.nan, np.nan, 3.0],
    'day2': [5.0, np.nan, np.nan],
    'day3': [np.nan, 3.0, np.nan],
    'day4': [6.0, 2.0, 4.0]
})

步骤2:核心处理代码

# 筛选需要处理的数值列(排除name列)
num_cols = [col for col in df.columns if col.startswith('day')]

# 生成掩码:标记每行第一个非NaN值之后的所有位置
has_seen_valid = df[num_cols].notna().cumsum(axis=1) > 0

# 将符合条件的NaN替换为0
df[num_cols] = df[num_cols].mask(has_seen_valid & df[num_cols].isna(), 0)

结果验证

处理后的数据框如下:

name  day1  day2  day3  day4
0  Alice   NaN   5.0   0.0   6.0
1    Bob   NaN   NaN   3.0   2.0
2  Carol   3.0   0.0   0.0   4.0

代码解释

  • df[num_cols].notna().cumsum(axis=1):对每行的非NaN值做累积计数,第一个非NaN值出现后,后续位置的累积计数都会大于0
  • has_seen_valid & df[num_cols].isna():筛选出"在第一个非NaN之后"且"当前值为NaN"的位置
  • mask()方法:将上述位置的值替换为0,其余值保持不变

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 16:59:57