一、数据清洗概述
数据清洗是数据分析过程中至关重要的一步,约占整个数据分析过程的60%-80%的时间。主要包括处理缺失值、异常值、重复值、格式不一致等问题。
二、常用工具
主要使用Python的Pandas库进行数据清洗:
import pandas as pd
import numpy as np
三、常见数据问题及处理方法
3.1缺失值处理
(1)创建示例数据
data = {'姓名': ['张三', '李四', '王五', '赵六', None],
'年龄': [25, 30, None, 35, 40],
'工资': [5000, 6000, 5500, None, 7000]}
df = pd.DataFrame(data)
(2) 查看缺失值
print(df.isnull().sum())
(3)处理方法
处理方法1:删除缺失行
df_drop = df.dropna()
print("删除缺失值后的数据:\n", df_drop)
处理方法2:填充缺失值
df_fill = df.fillna({'姓名': '未知', '年龄': df['年龄'].mean(), '工资': df['工资'].median()})
print("填充缺失值后的数据:\n", df_fill)
处理方法3:插值法
df['年龄'] = df['年龄'].interpolate()
print("插值处理后的数据:\n", df)
3.2重复值处理
(1)创建含重复值的数据
data = {'姓名': ['张三', '李四', '张三', '王五', '李四'],
'年龄': [25, 30, 25, 35, 30],
'工资': [5000, 6000, 5000, 5500, 6000]}
df = pd.DataFrame(data)
(2)检查重复值
print("重复值数量:", df.duplicated().sum())
(3)删除完全重复的行
df_drop_dup = df.drop_duplicates()
print("去重后的数据:\n", df_drop_dup)
(4)基于特定列删除重复值
df_drop_dup_name = df.drop_duplicates(subset=['姓名'])
print("基于姓名去重后的数据:\n", df_drop_dup_name)
3.3异常值处理
(1)创建含异常值的数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = {
'数学': [85, 90, 78, 92, 87, 130, 88, 95, 72, 150],
'物理': [72, 85, 90, 68, 82, 95, 78, 120, 65, 88],
'化学': [88, 92, 85, 78, 95, 102, 82, 78, 115, 90]
}
df = pd.DataFrame(data)
(2)基于3σ原则定义函数
def sigma_rule_outliers(df):
outliers_mask = pd.DataFrame(index=df.index, columns=df.columns)
#创建一个与原始df具有相同索引和列名的空DataFrame,所有单元格值被填充为False
for col in df.columns:
mean = df[col].mean()
std = df[col].std()
lower = mean - 3*std
upper = mean + 3*std
outliers_mask[col] = ~df[col].between(lower, upper)
return outliers_mask
(3)基于箱线图定义函数(IQR方法)
def iqr_rule_outliers(df):
outliers_mask = pd.DataFrame(index=df.index, columns=df.columns)
for col in df.columns:
Q1 = df[col].quantile(0.25)
Q3 = df[col].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5*IQR
upper = Q3 + 1.5*IQR
outliers_mask[col] = ~df[col].between(lower, upper)
return outliers_mask
(4)检测并处理异常值
--检测异常值:
sigma_outliers = sigma_rule_outliers(df)
iqr_outliers = iqr_rule_outliers(df)
print("\n3σ原则检测到的异常值位置:")
print(sigma_outliers)
print("\n箱线图(IQR)方法检测到的异常值位置:")
print(iqr_outliers)
--处理异常值(替换为中位数):
def replace_outliers(df, outliers_mask):
df_clean = df.copy( )
for col in df.columns:
median = df[col].median()
df_clean[col] = df_clean[col].mask(outliers_mask[col], median)
return df_clean
使用3σ原则处理
df_sigma_clean = replace_outliers(df, sigma_outliers)
使用IQR方法处理
df_iqr_clean = replace_outliers(df, iqr_outliers)
print("\n3σ原则处理后的数据:")
print(df_sigma_clean)
print("\nIQR方法处理后的数据:")
print(df_iqr_clean)
(5)建议
数据分布接近正态时:优先使用3σ原则
数据分布未知或偏态时:使用IQR方法
重要决策时:两种方法结合使用,人工复核异常值