Pandas删除含2个及以上NaN的行并用行均值填充剩余空值
DataFrame NaN值清洗实现方案
需求说明
需要对包含空值的DataFrame完成两项清洗操作:
- 删除存在2个及以上NaN值的行
- 对保留行内剩余的NaN值,使用该行数值字段的均值填充
初始测试数据
初始构造代码与数据预览如下:
import pandas as pd import numpy as np df = pd.DataFrame() df['id'] = [1, 2, 3, 4, 5,6] df['val1'] = [1, np.nan, 2, np.nan, 3, 5] df['val2'] = [np.nan, np.nan, 2, np.nan, np.nan, 5] df['val3'] = [4, np.nan, 2, np.nan, 7, 5] df['val4'] = [3, np.nan, 2, np.nan, np.nan, 5]
初始数据预览:
id val1 val2 val3 val4 0 1 1.0 NaN 4.0 3.0 1 2 NaN NaN NaN NaN 2 3 2.0 2.0 2.0 2.0 3 4 NaN NaN NaN NaN 4 5 3.0 NaN 7.0 NaN 5 6 5.0 5.0 5.0 5.0
实现代码
注意id是标识列,不参与空值计数和均值计算,仅对val开头的数值列做处理:
# 提取所有数值列 val_cols = [col for col in df.columns if col.startswith('val')] # 第一步:删除数值列空值≥2的行 # thresh参数指定每行至少保留3个非空值(即空值最多1个),subset限定空值统计范围为数值列 df_clean = df.dropna(thresh=3, subset=val_cols).copy() # 第二步:按行计算数值列均值,填充对应行的空值 row_mean = df_clean[val_cols].mean(axis=1) df_clean[val_cols] = df_clean[val_cols].fillna(row_mean, axis=0) # 数值保留两位小数,和示例格式对齐 df_clean[val_cols] = df_clean[val_cols].round(2) # 可选:重置索引为从0开始的连续值,和示例输出格式完全匹配 df_clean = df_clean.reset_index(drop=True)
输出结果
运行后得到的结果与预期完全一致:
id val1 val2 val3 val4 0 1 1.0 2.67 4.0 3.0 1 3 2.0 2.00 2.0 2.0 2 6 5.0 5.00 5.0 5.0
逻辑说明
- 行过滤环节直接调用
dropna实现,自动过滤掉id为2、4、5的三行:id2、id4的数值列全为空,id5的数值列有2个空值,均不符合保留条件 - 填充环节先逐行计算数值列的均值,再借助
fillna的索引对齐特性,把对应行的均值填到空值位置。比如id为1的行,三个非空值为1、4、3,均值为(1+4+3)/3≈2.67,刚好填充到val2的空值位置 - 加
copy()是为了避免后续赋值触发pandas的SettingWithCopyWarning警告
内容的提问来源于stack exchange,提问作者Mostafa Alaverdi
相关产品推荐
相关产品推荐

