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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:03:34