如何用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值出现后,后续位置的累积计数都会大于0has_seen_valid & df[num_cols].isna():筛选出"在第一个非NaN之后"且"当前值为NaN"的位置mask()方法:将上述位置的值替换为0,其余值保持不变
内容的提问来源于stack exchange,提问作者Amuseur
相关产品推荐
相关产品推荐

