数据清洗(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']])