如何用行中位数替换数据集NaN值?代码执行后未生效求助
行中位数替换DataFrame缺失值的正确实现
问题原因
你之前的代码失效的核心逻辑问题:
replace方法直接传入Series作为替换值时,会尝试将整个DataFrame的NaN统一替换为该Series的所有值,而非按行对应匹配替换。fillna(medianinf)默认按列名匹配填充,但medianinf是基于行索引生成的Series,和DataFrame的列名不匹配,因此无法完成填充。
正确解决方案
以下三种方法均可实现按行中位数替换对应行的NaN值:
方法1:apply逐行处理(直观易读)
# 定位需要处理的列范围 target_cols = inflation_data.columns[4:-1] # 逐行计算中位数并填充当前行的NaN inflation_data[target_cols] = inflation_data[target_cols].apply( lambda row: row.fillna(row.median()), axis=1 )
方法2:mask结合广播对齐(性能更优)
import numpy as np target_cols = inflation_data.columns[4:-1] # 预先计算每行的中位数 medianinf = inflation_data[target_cols].median(axis=1) # 将每行的NaN位置替换为对应行的中位数,通过[:, None]将Series转为二维数组实现广播 inflation_data[target_cols] = inflation_data[target_cols].mask( inflation_data[target_cols].isna(), medianinf[:, np.newaxis] )
方法3:转置后按列填充(利用fillna默认逻辑)
target_cols = inflation_data.columns[4:-1] medianinf = inflation_data[target_cols].median(axis=1) # 转置后行变列,用fillna按列填充(对应原行的中位数),完成后再转置回来 inflation_data[target_cols] = inflation_data[target_cols].T.fillna(medianinf).T
内容的提问来源于stack exchange,提问作者Puj
相关产品推荐
相关产品推荐

