Python处理纵向健康指标数据集的NaN值填充方案咨询
WHO健康指标数据集缺失值填充方案
1. 按国家对应时间范围均值填充
该方案实现简单,适合不需要保留时序特征的分析场景,基于pandas实现代码如下:
import pandas as pd # 读取本地数据集 df = pd.read_csv("life_expectancy_who.csv") # 定义需要填充的数值字段列表 numeric_cols = ["GDP", "Life expectancy", "Adult Mortality", "Alcohol", "BMI"] # 按国家分组,用对应国家该字段2000-2015年的均值替换NaN df[numeric_cols] = df.groupby("Country")[numeric_cols].transform( lambda col: col.fillna(col.mean()) )
特殊情况处理:若某国家对应字段全为缺失值,填充后仍会保留NaN,可后续补充全局均值填充或剔除对应国家记录
2. 保留时序特征的填充方案
针对面板纵向数据,优先使用按国家分组的时序插值方案,能最大程度保留各国指标随时间的变化趋势:
2.1 线性插值(通用场景首选)
假设指标随时间呈线性变化,用缺失值前后的有效值做线性拟合填充,实现成本低、效果稳定:
# 第一步:按国家、年份升序排序,保证时序顺序正确 df = df.sort_values(["Country", "Year"], ignore_index=True) # 第二步:按国家分组做线性插值,前后缺失的部分向两侧延伸填充 df[numeric_cols] = df.groupby("Country")[numeric_cols].transform( lambda col: col.interpolate(method="linear", limit_direction="both") )
2.2 时间加权插值(时序敏感度高的场景)
针对GDP、预期寿命这类随时间变化速率有明显波动的指标,使用时间加权插值结果更贴合实际变化规律:
# 将年份设为索引以启用时间插值方法 df = df.set_index("Year", drop=False) df[numeric_cols] = df.groupby("Country")[numeric_cols].transform( lambda col: col.interpolate(method="time", limit_direction="both") ) # 恢复原数据结构 df = df.reset_index(drop=True)
2.3 滚动均值填充(需保留短期波动特征的场景)
如果分析需要保留指标的短期波动特性,可使用3-5年窗口的滚动均值做填充:
df = df.sort_values(["Country", "Year"], ignore_index=True) df[numeric_cols] = df.groupby("Country")[numeric_cols].transform( lambda col: col.fillna(col.rolling(window=3, min_periods=1).mean()) )
注意:所有时序类填充方案必须先完成数据按国家、年份的排序操作,否则插值结果会出现逻辑错误
内容的提问来源于stack exchange,提问作者dl_atl
相关产品推荐
相关产品推荐

