5. Pandas 缺失值与异常值处理
Pandas 缺失值与异常值处理
在数据分析中,缺失值与异常值是常见问题。如果不处理,可能导致分析结果偏差或模型性能下降。本篇文章系统介绍 Pandas 中缺失值与异常值的检查与处理方法,包括检测、删除、填充以及简单的异常值处理技巧,为数据清洗和建模提供可靠基础。
1. 检查缺失值
在数据分析中,缺失值(NaN)是常见问题。Pandas 提供 isnull
和 notnull
方法来检测缺失值。
import pandas as pd
import numpy as npdata = {"姓名": ["张三", "李四", "王五", "赵六"],"年龄": [23, np.nan, 29, 40],"城市": ["北京", "上海", None, "深圳"]
}df = pd.DataFrame(data)
print(df)
姓名 年龄 城市
0 张三 23.0 北京
1 李四 NaN 上海
2 王五 29.0 None
3 赵六 40.0 深圳
1.1 判断缺失值
# 每个元素是否为缺失值
print(df.isnull())
姓名 年龄 城市
0 False False False
1 False False False
2 False False False
3 False False False
1.2 统计缺失值
# 每列缺失值数量
print(df.isnull().sum())
姓名 0
年龄 0
城市 0
dtype: int64
# 非缺失值数量
print(df.notnull().sum())
姓名 4
年龄 4
城市 4
dtype: int64
2. 删除缺失值
使用 dropna
可以删除含有缺失值的行或列。
axis=0
(默认):删除行axis=1
:删除列
# 删除含有缺失值的行
df_drop_row = df.dropna()
print(df_drop_row)
姓名 年龄 城市
0 张三 23.0 北京
3 赵六 40.0 深圳
# 删除含有缺失值的列
df_drop_col = df.dropna(axis=1)
print(df_drop_col)
姓名
0 张三
1 李四
2 王五
3 赵六
3. 填充缺失值
3.1 使用常数填充
df_fill = df.fillna({'年龄': 30, '城市': '未知'})
print(df_fill)
姓名 年龄 城市
0 张三 23.0 北京
1 李四 30.0 上海
2 王五 29.0 未知
3 赵六 40.0 深圳
3.2 前向/后向填充
# 前向填充
df_ffill = df.fillna(method='ffill')
print(df_ffill)
姓名 年龄 城市
0 张三 23.0 北京
1 李四 23.0 上海
2 王五 29.0 上海
3 赵六 40.0 深圳
# 后向填充
df_bfill = df.fillna(method='bfill')
print(df_bfill)
姓名 年龄 城市
0 张三 23.0 北京
1 李四 29.0 上海
2 王五 29.0 深圳
3 赵六 40.0 深圳
前向填充(
ffill
)用前一行的值填充,后向填充(bfill
)用后一行的值填充,可根据业务场景选择。
4. 简单异常值处理方法
异常值通常指明显偏离数据分布的极端值。常用处理方法包括逻辑筛选、均值/中位数替换以及四分位数法。
4.1 条件筛选
data = {"姓名": ["张三", "李四", "王五", "赵六"],"年龄": [23, 120, 29, 40],"城市": ["北京", "上海", "重庆", "深圳"]
}df = pd.DataFrame(data)
print(df)
姓名 年龄 城市
0 张三 23 北京
1 李四 120 上海
2 王五 29 重庆
3 赵六 40 深圳
# 假设年龄应在 0~100 岁之间
df_clean = df[(df['年龄'] >= 0) & (df['年龄'] <= 100)]
print(df_clean)
姓名 年龄 城市
0 张三 23 北京
2 王五 29 重庆
3 赵六 40 深圳
4.2 均值/中位数替换
# 将年龄中的异常值(这里以大于100为例)替换为平均值
mean_age = df['年龄'].mean()
df['年龄'] = df['年龄'].apply(lambda x: mean_age if x > 100 else x)
print(df)
姓名 年龄 城市
0 张三 23.0 北京
1 李四 53.0 上海
2 王五 29.0 重庆
3 赵六 40.0 深圳
4.3 四分位数法(IQR)检测
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)
筛选范围为:x < 3.875 或 x > 66.875
Empty DataFrame
Columns: [姓名, 年龄, 城市]
Index: []
5. 小结
- 缺失值处理
isnull()
/notnull()
:检测缺失值dropna()
:删除缺失值fillna()
:填充缺失值,可用常数、前向或后向填充
- 异常值处理
- 条件筛选
- 均值/中位数替换
- 四分位数法(IQR)
掌握这些方法可以有效提升数据质量,为统计分析、建模与可视化提供坚实基础。