5. Pandas 缺失值与异常值处理

Pandas 缺失值与异常值处理

在数据分析中,缺失值与异常值是常见问题。如果不处理,可能导致分析结果偏差或模型性能下降。本篇文章系统介绍 Pandas 中缺失值与异常值的检查与处理方法,包括检测、删除、填充以及简单的异常值处理技巧,为数据清洗和建模提供可靠基础。


1. 检查缺失值

在数据分析中,缺失值(NaN)是常见问题。Pandas 提供 isnullnotnull 方法来检测缺失值。

python 复制代码
import pandas as pd
import numpy as np

data = {
    "姓名": ["张三", "李四", "王五", "赵六"],
    "年龄": [23, np.nan, 29, 40],
    "城市": ["北京", "上海", None, "深圳"]
}

df = pd.DataFrame(data)
print(df)
txt 复制代码
   姓名    年龄   城市
0  张三  23.0   北京
1  李四   NaN   上海
2  王五  29.0  None
3  赵六  40.0   深圳

1.1 判断缺失值

python 复制代码
# 每个元素是否为缺失值
print(df.isnull())
txt 复制代码
      姓名     年龄     城市
0  False  False  False
1  False  False  False
2  False  False  False
3  False  False  False

1.2 统计缺失值

python 复制代码
# 每列缺失值数量
print(df.isnull().sum())
txt 复制代码
姓名    0
年龄    0
城市    0
dtype: int64
python 复制代码
# 非缺失值数量
print(df.notnull().sum())
txt 复制代码
姓名    4
年龄    4
城市    4
dtype: int64

2. 删除缺失值

使用 dropna 可以删除含有缺失值的行或列。

  • axis=0(默认):删除行
  • axis=1:删除列
python 复制代码
# 删除含有缺失值的行
df_drop_row = df.dropna()
print(df_drop_row)
txt 复制代码
   姓名    年龄  城市
0  张三  23.0  北京
3  赵六  40.0  深圳
python 复制代码
# 删除含有缺失值的列
df_drop_col = df.dropna(axis=1)
print(df_drop_col)
txt 复制代码
   姓名
0  张三
1  李四
2  王五
3  赵六

3. 填充缺失值

3.1 使用常数填充

python 复制代码
df_fill = df.fillna({'年龄': 30, '城市': '未知'})
print(df_fill)
txt 复制代码
   姓名    年龄  城市
0  张三  23.0  北京
1  李四  30.0  上海
2  王五  29.0  未知
3  赵六  40.0  深圳

3.2 前向/后向填充

python 复制代码
# 前向填充
df_ffill = df.fillna(method='ffill')
print(df_ffill)
txt 复制代码
   姓名    年龄  城市
0  张三  23.0  北京
1  李四  23.0  上海
2  王五  29.0  上海
3  赵六  40.0  深圳
python 复制代码
# 后向填充
df_bfill = df.fillna(method='bfill')
print(df_bfill)
txt 复制代码
   姓名    年龄  城市
0  张三  23.0  北京
1  李四  29.0  上海
2  王五  29.0  深圳
3  赵六  40.0  深圳

前向填充(ffill)用前一行的值填充,后向填充(bfill)用后一行的值填充,可根据业务场景选择。


4. 简单异常值处理方法

异常值通常指明显偏离数据分布的极端值。常用处理方法包括逻辑筛选、均值/中位数替换以及四分位数法。

4.1 条件筛选

python 复制代码
data = {
    "姓名": ["张三", "李四", "王五", "赵六"],
    "年龄": [23, 120, 29, 40],
    "城市": ["北京", "上海", "重庆", "深圳"]
}

df = pd.DataFrame(data)
print(df)
txt 复制代码
   姓名   年龄  城市
0  张三   23  北京
1  李四  120  上海
2  王五   29  重庆
3  赵六   40  深圳
python 复制代码
# 假设年龄应在 0~100 岁之间
df_clean = df[(df['年龄'] >= 0) & (df['年龄'] <= 100)]
print(df_clean)
txt 复制代码
   姓名  年龄  城市
0  张三  23  北京
2  王五  29  重庆
3  赵六  40  深圳

4.2 均值/中位数替换

python 复制代码
# 将年龄中的异常值(这里以大于100为例)替换为平均值
mean_age = df['年龄'].mean()
df['年龄'] = df['年龄'].apply(lambda x: mean_age if x > 100 else x)
print(df)
txt 复制代码
   姓名    年龄  城市
0  张三  23.0  北京
1  李四  53.0  上海
2  王五  29.0  重庆
3  赵六  40.0  深圳

4.3 四分位数法(IQR)检测

python 复制代码
Q1 = df['年龄'].quantile(0.25)
Q3 = df['年龄'].quantile(0.75)
IQR = Q3 - Q1
outliers = df[(df['年龄'] < Q1 - 1.5*IQR) | (df['年龄'] > Q3 + 1.5*IQR)]

print(f'筛选范围为:x < {Q1 - 1.5*IQR} 或 x > {Q3 + 1.5*IQR}')

print(outliers)
txt 复制代码
筛选范围为:x < 3.875 或 x > 66.875
Empty DataFrame
Columns: [姓名, 年龄, 城市]
Index: []

5. 小结

  1. 缺失值处理
    • isnull() / notnull():检测缺失值
    • dropna():删除缺失值
    • fillna():填充缺失值,可用常数、前向或后向填充
  2. 异常值处理
    • 条件筛选
    • 均值/中位数替换
    • 四分位数法(IQR)

掌握这些方法可以有效提升数据质量,为统计分析、建模与可视化提供坚实基础。

相关推荐
程与留11 分钟前
06_Qt 常用数据类型与容器:QString、QList、QVector、QMap 的性能与实现分析
数据结构·qt
vortex518 分钟前
从Conda到UV:Python项目依赖管理的现代演进
python·conda·uv
林森lsjs20 分钟前
队列 FIFO 原理 & 手撕两种队列实现(链表 + 循环数组)—数据结构陆
java·开发语言·数据结构·队列
何以解忧,唯有..34 分钟前
Python time 模块详解:时间处理与日期操作指南
开发语言·python
梅雅达编程笔记1 小时前
Day 18 · 综合实战 B:AI 客服 Agent(专栏收官)
python·智能客服·ai agent·意图识别·ai客服·大模型应用·ai办公自动化
H_oRIZoN_1 小时前
Linux入门DAY23(C语言树形结构)
linux·c语言·数据结构
间歇性努力持续性发呆的野生快乐选手1 小时前
stl容器使用和算法简介
数据结构·c++
测试老哥1 小时前
Pytest自动化测试框架tep环境变量、fixtures、用例三者之间的关系
自动化测试·软件测试·python·测试工具·测试用例·pytest·职场发展
Buke..1 小时前
【APP 逆向】哔哩哔哩 sign 参数逆向(下):OLLVM 混淆还原 sign 算法
java·javascript·爬虫·python·算法
JacksonMx1 小时前
Java CompletableFuture 异步编程实战:从入门到架构师避坑指南
linux·数据库·python