在使用Python进行数据分析时,Pandas是最核心的数据处理库之一,面对原始数据中常见的缺失值和异常值问题,掌握对应的处理方法能有效提升数据质量,为后续分析工作打好基础。

Pandas处理缺失值的方法
1. 判断缺失值
首先需要定位数据中的缺失值,Pandas提供了isnull()和notnull()方法来完成这个操作,返回的结果是布尔型数据,True代表对应位置是缺失值。
import pandas as pd
import numpy as np
# 创建包含缺失值的测试数据
data = {
"name": ["张三", "李四", "王五", "赵六"],
"age": [20, np.nan, 25, 22],
"score": [88, 92, np.nan, 85]
}
df = pd.DataFrame(data)
# 判断整个DataFrame的缺失值
print("缺失值判断结果:")
print(df.isnull())
# 统计每一列的缺失值数量
print("每列缺失值数量:")
print(df.isnull().sum())
2. 删除缺失值
当缺失值占比较小,或者缺失值所在的行/列对分析没有太大影响时,可以选择直接删除缺失值,使用dropna()方法实现。
# 删除包含任意缺失值的行(默认行为)
df_drop_row = df.dropna()
print("删除含缺失值的行后:")
print(df_drop_row)
# 删除全部为缺失值的行
df_drop_all = df.dropna(how="all")
# 删除缺失值占比超过阈值的列,thresh参数表示非空值的最小数量
df_drop_col = df.dropna(axis=1, thresh=3)
print("保留至少3个非空值的列后:")
print(df_drop_col)
3. 填充缺失值
更多时候我们需要保留数据量,选择用合适的值填充缺失值,fillna()方法支持多种填充策略。
# 用固定值填充缺失值
df_fill_const = df.fillna(0)
print("用0填充缺失值后:")
print(df_fill_const)
# 用前一行的值填充(前向填充)
df_fill_ffill = df.fillna(method="ffill")
print("前向填充后:")
print(df_fill_ffill)
# 用同列的平均值填充数值型缺失值
df["age"] = df["age"].fillna(df["age"].mean())
df["score"] = df["score"].fillna(df["score"].mean())
print("用平均值填充数值列后:")
print(df)
Pandas处理异常值的方法
1. 识别异常值
异常值是指明显偏离整体数据分布的数值,常用的识别方法包括3σ原则和箱线图法。
3σ原则识别
假设数据服从正态分布,99.7%的数值会落在均值加减3倍标准差的范围内,超出这个范围的就是异常值。
# 生成正态分布测试数据
test_data = pd.DataFrame({
"value": np.random.normal(loc=50, scale=10, size=100).tolist() + [120, 130, -20]
})
# 计算均值和标准差
mean_val = test_data["value"].mean()
std_val = test_data["value"].std()
# 筛选异常值
outliers_3sigma = test_data[(test_data["value"] < mean_val - 3*std_val) | (test_data["value"] > mean_val + 3*std_val)]
print("3σ原则识别出的异常值:")
print(outliers_3sigma)
箱线图法识别
箱线图通过四分位数来定义异常值,小于Q1-1.5*IQR或者大于Q3+1.5*IQR的数值为异常值,IQR是四分位距,即Q3减去Q1。
# 计算四分位数
q1 = test_data["value"].quantile(0.25)
q3 = test_data["value"].quantile(0.75)
iqr = q3 - q1
# 筛选异常值
outliers_box = test_data[(test_data["value"] < q1 - 1.5*iqr) | (test_data["value"] > q3 + 1.5*iqr)]
print("箱线图法识别出的异常值:")
print(outliers_box)
2. 处理异常值
识别到异常值后,可以根据业务场景选择删除或者替换异常值。
# 删除异常值行
df_no_outliers = test_data[(test_data["value"] >= q1 - 1.5*iqr) & (test_data["value"] <= q3 + 1.5*iqr)]
print("删除异常值后的数据量:", len(df_no_outliers))
# 用边界值替换异常值(盖帽法)
test_data.loc[test_data["value"] < q1 - 1.5*iqr, "value"] = q1 - 1.5*iqr
test_data.loc[test_data["value"] > q3 + 1.5*iqr, "value"] = q3 + 1.5*iqr
print("盖帽法处理异常值后的数据:")
print(test_data.describe())
处理方案选择建议
在实际项目中,选择缺失值和异常值的处理方案需要结合数据特点和分析目标:
- 缺失值占比小于5%且对分析影响小,优先选择删除缺失值
- 数值型列的缺失值优先用均值、中位数填充,类别型列优先用众数填充
- 异常值如果明显是录入错误,可以直接删除或修正
- 如果数据量较小,尽量用填充、盖帽法等方式保留数据,避免删除导致样本不足