第三章:数据清洗与预处理


文档摘要

第三章:数据清洗与预处理 第三章:数据清洗与预处理 3.1 数据清洗的必要性 原始数据往往存在各种问题,例如: 缺失值: 数据集中某些字段的值缺失。 重复值: 数据集中存在完全相同或部分相同的记录。 异常值: 数据集中存在明显偏离正常范围的值。 数据类型错误: 数据的类型与实际含义不符。 格式不一致: 数据的格式不统一,例如日期格式。 不一致性: 数据集中存在相互矛盾或冲突的信息。 如果不对这些问题进行处理,可能会导致: 分析结果偏差或错误。 模型训练效果不佳。 可视化结果失真。 决策失误。 因此,在进行数据分析之前,必须对数据进行清洗和预处理,以提高数据质量,确保分析结果的可靠性。 3.2 数据清洗与预处理的主要步骤 数据清洗与预处理是一个迭代的过程,通常包括以下步骤: 3.

第三章:数据清洗与预处理

第三章:数据清洗与预处理

3.1 数据清洗的必要性

原始数据往往存在各种问题,例如:

  • 缺失值: 数据集中某些字段的值缺失。

  • 重复值: 数据集中存在完全相同或部分相同的记录。

  • 异常值: 数据集中存在明显偏离正常范围的值。

  • 数据类型错误: 数据的类型与实际含义不符。

  • 格式不一致: 数据的格式不统一,例如日期格式。

  • 不一致性: 数据集中存在相互矛盾或冲突的信息。

如果不对这些问题进行处理,可能会导致:

  • 分析结果偏差或错误。

  • 模型训练效果不佳。

  • 可视化结果失真。

  • 决策失误。

因此,在进行数据分析之前,必须对数据进行清洗和预处理,以提高数据质量,确保分析结果的可靠性。

3.2 数据清洗与预处理的主要步骤

数据清洗与预处理是一个迭代的过程,通常包括以下步骤:

3.3 缺失值处理

缺失值是数据集中最常见的问题之一。Pandas 提供了多种处理缺失值的方法。

  • 识别缺失值: 使用 isnull()notnull() 方法检测缺失值。

    import pandas as pd import numpy as np # 创建包含缺失值的 DataFrame data = {'A': [1, 2, np.nan, 4], 'B': [5, np.nan, 7, 8], 'C': [9, 10, 11, np.nan]} df = pd.DataFrame(data) # 检测缺失值 print(df.isnull()) print(df.notnull())
  • 删除缺失值: 使用 dropna() 方法删除包含缺失值的行或列。

    # 删除包含缺失值的行 df_dropna_row = df.dropna() print(df_dropna_row) # 删除包含缺失值的列 df_dropna_col = df.dropna(axis=1) print(df_dropna_col) # 设置删除缺失值的阈值 df_dropna_thresh = df.dropna(thresh=3) #至少包含3个非缺失值 print(df_dropna_thresh)
  • 填充缺失值: 使用 fillna() 方法填充缺失值。常用的填充方法包括:

    • 常数填充: 使用一个固定的值填充缺失值。

    • 均值/中位数/众数填充: 使用列的均值、中位数或众数填充缺失值。

    • 向前/向后填充: 使用前一个或后一个有效值填充缺失值。

    • 插值填充: 使用插值方法估计缺失值。

    # 常数填充 df_fillna_constant = df.fillna(0) print(df_fillna_constant) # 均值填充 df_fillna_mean = df.fillna(df.mean()) print(df_fillna_mean) # 向前填充 df_fillna_ffill = df.fillna(method='ffill') print(df_fillna_ffill) # 插值填充 df_fillna_interpolate = df.interpolate() print(df_fillna_interpolate)

3.4 重复值处理

重复值会影响数据分析的准确性。Pandas 提供了 duplicated()drop_duplicates() 方法来处理重复值。

  • 识别重复值: 使用 duplicated() 方法检测重复值。

    # 创建包含重复值的 DataFrame data = {'A': [1, 2, 2, 4], 'B': [5, 6, 6, 8], 'C': [9, 10, 10, 12]} df = pd.DataFrame(data) # 检测重复值 print(df.duplicated())
  • 删除重复值: 使用 drop_duplicates() 方法删除重复值。

    # 删除重复值 df_drop_duplicates = df.drop_duplicates() print(df_drop_duplicates) # 指定列删除重复值 df_drop_duplicates_subset = df.drop_duplicates(subset=['A', 'B']) print(df_drop_duplicates_subset) # 保留第一个或最后一个重复值 df_drop_duplicates_keep_first = df.drop_duplicates(keep='first') # 默认 df_drop_duplicates_keep_last = df.drop_duplicates(keep='last') print(df_drop_duplicates_keep_first) print(df_drop_duplicates_keep_last)

3.5 异常值处理

异常值是指明显偏离正常范围的值。处理异常值的方法包括:

  • 删除异常值: 直接删除包含异常值的记录。

  • 替换异常值: 使用一个合理的值替换异常值,例如均值、中位数或边界值。

  • 转换异常值: 使用数学函数对异常值进行转换,例如对数转换或 Box-Cox 转换。

  • 盖帽法(Capping): 将异常值替换为指定的最大值或最小值。

常用的异常值检测方法包括:

  • 箱线图: 通过箱线图可以直观地识别异常值。

  • 标准差: 将偏离均值超过一定倍数标准差的值视为异常值。

  • IQR (四分位距): 将小于 Q1 - 1.5 * IQR 或大于 Q3 + 1.5 * IQR 的值视为异常值。

    # 创建包含异常值的 DataFrame data = {'A': [1, 2, 3, 4, 100], 'B': [5, 6, 7, 8, -10]} df = pd.DataFrame(data) # 箱线图 import matplotlib.pyplot as plt df.boxplot() plt.show() # 基于标准差的异常值检测 mean = df['A'].mean() std = df['A'].std() threshold = 2 # 设置阈值为 2 个标准差 outliers = df[(df['A'] - mean).abs() > threshold * std] print(outliers) # 基于 IQR 的异常值检测 Q1 = df['A'].quantile(0.25) Q3 = df['A'].quantile(0.75) IQR = Q3 - Q1 outliers = df[(df['A'] < Q1 - 1.5 * IQR) | (df['A'] > Q3 + 1.5 * IQR)] print(outliers) # 盖帽法处理异常值 lower_bound = df['A'].quantile(0.05) upper_bound = df['A'].quantile(0.95) df['A'] = df['A'].clip(lower_bound, upper_bound) print(df)

3.6 数据类型转换

确保数据的类型与实际含义相符。Pandas 提供了 astype() 方法来转换数据类型。

# 创建 DataFrame data = {'A': ['1', '2', '3'], 'B': [4.5, 5.6, 6.7]} df = pd.DataFrame(data) # 查看数据类型 print(df.dtypes) # 转换数据类型 df['A'] = df['A'].astype(int) df['B'] = df['B'].astype(int) # 再次查看数据类型 print(df.dtypes)

3.7 格式标准化

将数据的格式统一,例如日期格式、字符串格式等。

  • 日期格式标准化: 使用 to_datetime() 方法将字符串转换为日期类型,并指定日期格式。

    # 创建 DataFrame data = {'Date': ['2023-10-26', '10/27/2023', '20231028']} df = pd.DataFrame(data) # 转换日期格式 df['Date'] = pd.to_datetime(df['Date'], format='mixed') #format='mixed'可以自动推断格式 print(df['Date'])
  • 字符串格式标准化: 使用字符串方法(例如 lower(), upper(), strip())将字符串转换为统一的格式。

    # 创建 DataFrame data = {'Name': [' Alice', 'Bob ', 'Charlie']} df = pd.DataFrame(data) # 字符串格式标准化 df['Name'] = df['Name'].str.strip().str.lower() print(df['Name'])

3.8 数据一致性处理

检查数据集中是否存在相互矛盾或冲突的信息,并进行处理。例如,检查同一用户的年龄和出生日期是否一致。数据一致性处理通常需要根据具体的业务逻辑进行。

3.9 总结

数据清洗与预处理是数据分析流程中不可或缺的步骤。通过本章的学习,你应该掌握了 Pandas 中处理缺失值、重复值、异常值、数据类型转换和格式标准化等常见任务的方法。请记住,数据清洗与预处理是一个迭代的过程,需要根据具体的数据集和分析目标进行调整。高质量的数据是分析结果可靠性的保证。


发布者: 作者: 转发
评论区 (0)
U