数据清洗(Data Cleaning)是指在数据分析和建模之前,对数据进行检查、修正和转换,以提高数据质量和准确性的过程。数据清洗通常包括以下步骤:
处理缺失值
删除重复数据
纠正数据类型
处理异常值
通过数据清洗,我们可以确保数据集更适合后续的分析或机器学习任务。
Python 数据清洗示例
Titanic 数据集包含了 Titanic 号乘客的信息,如年龄、性别、船舱等级等,其中存在一些缺失值和分类变量,非常适合展示数据清洗技术。
import pandas as pd
import numpy as np
# 加载 Titanic 数据集
url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"
df = pd.read_csv(url)
# 检查缺失值
print("清洗前的缺失值情况:")
print(df.isnull().sum())
# 处理缺失值
# 用中位数填充 'Age' 列的缺失值
df['Age'].fillna(df['Age'].median(), inplace=True)
# 删除 'Cabin' 列,因为缺失值过多
df.drop('Cabin', axis=1, inplace=True)
# 用最常见的值填充 'Embarked' 列的缺失值
df['Embarked'].fillna(df['Embarked'].mode()[0], inplace=True)
# 检查并删除重复数据
duplicates = df.duplicated().sum()
print(f"重复行数: {duplicates}")
df.drop_duplicates(inplace=True)
# 编码分类变量
# 将 'Sex' 和 'Embarked' 列转换为数值型
df = pd.get_dummies(df, columns=['Sex', 'Embarked'], drop_first=True)
# 显示清洗后的数据集
print("\n清洗后的缺失值情况:")
print(df.isnull().sum())
print("\n清洗后的数据集前几行:")
print(df.head())
使用 Pandas 清洗数据的常用手段
处理缺失值
缺失值是数据中常见的问题,Pandas 提供了多种方法来处理:
识别缺失值:使用 isnull() 或 isna() 检测数据中的缺失值。
删除缺失值:使用 dropna() 删除包含缺失值的行或列。
填充缺失值:使用 fillna() 填充缺失值,常见方法包括:
用特定值填充(如 0、均值、中位数等)。
前向填充(ffill)或后向填充(bfill)。
示例代码
# 用均值填充缺失值
df['column'].fillna(df['column'].mean(), inplace=True)
# 删除包含缺失值的行
df.dropna(axis=0, inplace=True)
处理重复数据
重复数据可能会影响分析结果,Pandas 可以轻松识别和删除:
识别重复数据:使用 duplicated() 检测重复行。
删除重复数据:使用 drop_duplicates() 删除重复行。
示例代码
# 删除重复行
df.drop_duplicates(inplace=True)
数据类型转换
数据类型的正确性对分析至关重要,Pandas 提供了 astype() 来转换数据类型:
将列的数据类型转换为所需的类型(如从字符串到数值型、从浮点数到整数等)。
示例代码:
# 将列转换为浮点数类型
df['column'] = df['column'].astype(float)
异常值处理
异常值可能会干扰数据分析,Pandas 结合统计方法可以处理:
识别异常值:通过统计方法(如 IQR 或 Z-score)识别异常值。
处理异常值:可以删除异常值,或用统计值(如中位数)替换。
# 使用 IQR 方法删除异常值
Q1 = df['column'].quantile(0.25)
Q3 = df['column'].quantile(0.75)
IQR = Q3 - Q1
df = df[~((df['column'] < (Q1 - 1.5 * IQR)) | (df['column'] > (Q3 + 1.5 * IQR)))]
文本数据清洗
文本数据常需要标准化处理,Pandas 提供了字符串方法:
去除多余空格:使用 str.strip() 删除字符串两端的空格。
大小写转换:使用 str.lower() 或 str.upper() 统一大小写。
正则表达式处理:使用 str.replace() 或 str.extract() 进行复杂替换或提取。
# 去除两端空格并转换为小写
df['text_column'] = df['text_column'].str.strip()
df['text_column'] = df['text_column'].str.lower()
日期时间处理
日期时间数据需要转换为标准格式并提取有用信息:
转换日期时间:使用 pd.to_datetime() 将字符串转换为日期时间格式。
提取日期时间组件:使用 dt 访问器提取年、月、日等。
示例代码:
# 转换为日期时间格式并提取年份
df['date_column'] = pd.to_datetime(df['date_column'])
df['year'] = df['date_column'].dt.year
数据规范化
规范化使数据更适合分析或建模:
标准化:将数据缩放到均值为 0、标准差为 1。
归一化:将数据缩放到 [0, 1] 范围内。
示例代码:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df['standardized_column'] = scaler.fit_transform(df[['column']])