datascience数据清洗实战处理缺失值与异常值的完整指南【免费下载链接】datascienceA Python library for introductory data science项目地址: https://gitcode.com/gh_mirrors/dat/datascience数据清洗是数据分析中至关重要的一步而datascience库作为伯克利数据科学课程的核心工具提供了强大而简洁的数据清洗功能。本文将为您详细介绍如何使用datascience库高效处理缺失值和异常值让您的数据分析工作更加精准可靠。为什么数据清洗如此重要 在真实世界的数据分析中原始数据往往存在各种问题缺失值、异常值、重复记录等。这些问题如果不加处理会严重影响分析结果的准确性。datascience库的Table类提供了丰富的API让数据清洗变得简单直观。快速安装与导入datascience开始之前让我们先安装datascience库pip install datascience导入必要的模块from datascience import Table import numpy as np数据加载与初步探索首先让我们创建一个包含缺失值和异常值的示例数据集# 创建包含缺失值和异常值的示例数据 data Table().with_columns([ 姓名, [张三, 李四, 王五, 赵六, 钱七, 孙八], 年龄, [25, 32, np.nan, 45, 18, 150], # 包含缺失值和异常值 成绩, [85, 92, 78, np.nan, 65, 105], # 包含缺失值和异常值 城市, [北京, 上海, 广州, 深圳, 杭州, np.nan] ]) print(原始数据) print(data)识别缺失值的3种实用方法 1. 使用where方法筛选非空值datascience库的where方法配合条件判断可以轻松筛选出非空值# 筛选年龄列非空的行 非空年龄 data.where(年龄, are.not_equal_to(np.nan)) print(年龄非空的数据) print(非空年龄)2. 使用Python原生方法检测缺失值# 检查每列的缺失值数量 for column in data.labels: column_data data.column(column) missing_count sum(np.isnan(val) if isinstance(val, (int, float)) else (val is None or val ) for val in column_data) print(f{column}列的缺失值数量{missing_count})3. 创建缺失值标记列# 为每列创建缺失值标记 for column in data.labels: data data.with_column( f{column}_缺失, [np.isnan(val) if isinstance(val, (int, float)) else (val is None or val ) for val in data.column(column)] )处理缺失值的5种策略 策略1删除包含缺失值的行# 删除任何列包含缺失值的行 清洁数据 data.where(年龄, are.not_equal_to(np.nan)).where(成绩, are.not_equal_to(np.nan)).where(城市, are.not_equal_to(np.nan)) print(删除缺失值后的数据) print(清洁数据)策略2用平均值填充数值型缺失值# 计算年龄的平均值排除缺失值 年龄数据 data.column(年龄) 有效年龄 [age for age in 年龄数据 if not np.isnan(age)] 平均年龄 sum(有效年龄) / len(有效年龄) # 填充缺失值 填充后年龄 [平均年龄 if np.isnan(age) else age for age in 年龄数据] data data.with_column(年龄_填充, 填充后年龄)策略3用中位数填充数值型缺失值# 计算成绩的中位数 成绩数据 data.column(成绩) 有效成绩 [score for score in 成绩数据 if not np.isnan(score)] 中位数成绩 sorted(有效成绩)[len(有效成绩) // 2] # 填充缺失值 填充后成绩 [中位数成绩 if np.isnan(score) else score for score in 成绩数据] data data.with_column(成绩_填充, 填充后成绩)策略4用众数填充分类型缺失值# 找出城市列的众数 城市数据 data.column(城市) 有效城市 [city for city in 城市数据 if city is not None and city ! and not isinstance(city, float) or not np.isnan(city)] 城市计数 {} for city in 有效城市: 城市计数[city] 城市计数.get(city, 0) 1 众数城市 max(城市计数, key城市计数.get) # 填充缺失值 填充后城市 [众数城市 if (city is None or city or (isinstance(city, float) and np.isnan(city))) else city for city in 城市数据] data data.with_column(城市_填充, 填充后城市)策略5使用前向或后向填充# 简单的向前填充实现 def 向前填充(列数据): 结果 [] 上一个有效值 None for 值 in 列数据: if np.isnan(值) if isinstance(值, (int, float)) else (值 is None or 值 ): if 上一个有效值 is not None: 结果.append(上一个有效值) else: 结果.append(值) else: 结果.append(值) 上一个有效值 值 return 结果 年龄向前填充 向前填充(data.column(年龄)) data data.with_column(年龄_向前填充, 年龄向前填充)检测异常值的4种有效方法 ⚠️方法1使用IQR四分位距方法def 检测异常值_四分位距(数据列): 使用IQR方法检测异常值 # 排除缺失值 有效数据 [x for x in 数据列 if not np.isnan(x)] # 计算四分位数 q1 np.percentile(有效数据, 25) q3 np.percentile(有效数据, 75) iqr q3 - q1 # 定义异常值边界 下边界 q1 - 1.5 * iqr 上边界 q3 1.5 * iqr # 标记异常值 异常值标记 [x 下边界 or x 上边界 for x in 数据列] return 异常值标记 # 检测年龄异常值 年龄异常值 检测异常值_四分位距(data.column(年龄)) data data.with_column(年龄_异常值, 年龄异常值)方法2使用Z-score方法def 检测异常值_z分数(数据列): 使用Z-score方法检测异常值 # 排除缺失值 有效数据 [x for x in 数据列 if not np.isnan(x)] # 计算均值和标准差 均值 np.mean(有效数据) 标准差 np.std(有效数据) # 计算Z-score并标记异常值 z分数标记 [] for x in 数据列: if np.isnan(x): z分数标记.append(False) else: z分数 abs((x - 均值) / 标准差) if 标准差 ! 0 else 0 z分数标记.append(z分数 3) # Z-score大于3视为异常值 return z分数标记 # 检测成绩异常值 成绩异常值 检测异常值_z分数(data.column(成绩)) data data.with_column(成绩_异常值, 成绩异常值)方法3使用百分位数方法def 检测异常值_百分位数(数据列, 下限百分位1, 上限百分位99): 使用百分位数方法检测异常值 # 排除缺失值 有效数据 [x for x in 数据列 if not np.isnan(x)] # 计算百分位数 下限 np.percentile(有效数据, 下限百分位) 上限 np.percentile(有效数据, 上限百分位) # 标记异常值 异常值标记 [x 下限 or x 上限 for x in 数据列] return 异常值标记 # 检测年龄异常值使用1%和99%百分位数 年龄异常值_百分位 检测异常值_百分位数(data.column(年龄)) data data.with_column(年龄_异常值_百分位, 年龄异常值_百分位)方法4基于业务规则的检测def 基于业务规则检测异常值(数据): 基于业务规则检测异常值 异常值标记 [] for i in range(data.num_rows): 年龄 data.column(年龄)[i] 成绩 data.column(成绩)[i] # 业务规则年龄在0-120之间成绩在0-100之间 年龄异常 not np.isnan(年龄) and (年龄 0 or 年龄 120) 成绩异常 not np.isnan(成绩) and (成绩 0 or 成绩 100) 异常值标记.append(年龄异常 or 成绩异常) return 异常值标记 业务异常值 基于业务规则检测异常值(data) data data.with_column(业务规则异常值, 业务异常值)处理异常值的3种实用技巧 技巧1删除异常值# 删除所有标记为异常值的行 清洁数据 data.where(年龄_异常值, are.equal_to(False)).where(成绩_异常值, are.equal_to(False)) print(删除异常值后的数据) print(清洁数据.select([姓名, 年龄, 成绩, 城市]))技巧2用边界值替换异常值def 用边界值替换异常值(数据列, 异常值标记): 用边界值替换异常值 有效数据 [x for x in 数据列 if not np.isnan(x)] q1 np.percentile(有效数据, 25) q3 np.percentile(有效数据, 75) iqr q3 - q1 下边界 q1 - 1.5 * iqr 上边界 q3 1.5 * iqr 处理后数据 [] for i, x in enumerate(数据列): if 异常值标记[i] and not np.isnan(x): if x 下边界: 处理后数据.append(下边界) elif x 上边界: 处理后数据.append(上边界) else: 处理后数据.append(x) return 处理后数据 # 处理年龄异常值 年龄处理 用边界值替换异常值(data.column(年龄), data.column(年龄_异常值)) data data.with_column(年龄_处理, 年龄处理)技巧3用中位数替换异常值def 用中位数替换异常值(数据列, 异常值标记): 用中位数替换异常值 有效数据 [x for i, x in enumerate(数据列) if not 异常值标记[i] and not np.isnan(x)] 中位数 np.median(有效数据) if 有效数据 else np.nan 处理后数据 [] for i, x in enumerate(数据列): if 异常值标记[i] and not np.isnan(x): 处理后数据.append(中位数) else: 处理后数据.append(x) return 处理后数据 # 处理成绩异常值 成绩处理 用中位数替换异常值(data.column(成绩), data.column(成绩_异常值)) data data.with_column(成绩_处理, 成绩处理)完整的数据清洗流程示例 让我们通过一个完整的例子展示如何使用datascience库进行端到端的数据清洗# 步骤1加载数据 原始数据 Table().with_columns([ 学生ID, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 数学成绩, [85, 92, 78, np.nan, 65, 105, 88, 76, 91, np.nan], 英语成绩, [78, 85, np.nan, 92, 67, 110, 82, 74, 89, 95], 出勤率, [0.95, 0.88, 0.92, 0.85, 1.2, 0.78, 0.91, 0.94, 0.87, 0.90] ]) print(原始数据) print(原始数据) # 步骤2识别缺失值 缺失值统计 Table().with_columns([ 列名, 原始数据.labels, 缺失值数量, [sum(np.isnan(x) if isinstance(x, (int, float)) else 0 for x in 原始数据.column(col)) for col in 原始数据.labels] ]) print(\n缺失值统计) print(缺失值统计) # 步骤3处理缺失值用列均值填充 for col in [数学成绩, 英语成绩]: 列数据 原始数据.column(col) 有效值 [x for x in 列数据 if not np.isnan(x)] if 有效值: 均值 np.mean(有效值) 填充后 [均值 if np.isnan(x) else x for x in 列数据] 原始数据 原始数据.with_column(f{col}_填充, 填充后) # 步骤4检测异常值 def 标记异常值(列数据): 有效数据 [x for x in 列数据 if not np.isnan(x)] q1 np.percentile(有效数据, 25) q3 np.percentile(有效数据, 75) iqr q3 - q1 下边界 q1 - 1.5 * iqr 上边界 q3 1.5 * iqr return [x 下边界 or x 上边界 for x in 列数据] 数学异常值 标记异常值(原始数据.column(数学成绩_填充)) 英语异常值 标记异常值(原始数据.column(英语成绩_填充)) 出勤异常值 标记异常值(原始数据.column(出勤率)) 原始数据 原始数据.with_columns([ 数学异常值, 数学异常值, 英语异常值, 英语异常值, 出勤异常值, 出勤异常值 ]) # 步骤5处理异常值 清洁数据 原始数据.where(数学异常值, are.equal_to(False)).where(英语异常值, are.equal_to(False)).where(出勤异常值, are.equal_to(False)) print(\n清洗后的数据) print(清洁数据.select([学生ID, 数学成绩_填充, 英语成绩_填充, 出勤率]))数据清洗的最佳实践建议 1. 始终保留原始数据在进行任何数据清洗操作前务必创建数据的副本原始数据备份 原始数据.copy()2. 记录清洗步骤创建清洗日志记录每一步的操作清洗日志 Table().with_columns([ 步骤, [加载数据, 识别缺失值, 填充缺失值, 检测异常值, 处理异常值], 操作, [读取CSV文件, 统计各列缺失值, 用均值填充数值列, 使用IQR方法检测, 删除异常值行], 影响行数, [原始数据.num_rows, 原始数据.num_rows, 原始数据.num_rows, 原始数据.num_rows, 清洁数据.num_rows] ])3. 验证清洗效果清洗后验证数据质量def 验证数据质量(数据表): 验证数据质量指标 质量报告 Table().with_columns([ 指标, [总行数, 缺失值比例, 异常值比例, 数据完整性], 值, [ 数据表.num_rows, sum(sum(1 for x in 数据表.column(col) if np.isnan(x)) for col in 数据表.labels) / (数据表.num_rows * 数据表.num_columns), 0.0, # 异常值比例需要根据具体检测方法计算 良好 if 数据表.num_rows 0 else 差 ] ]) return 质量报告 质量报告 验证数据质量(清洁数据) print(数据质量报告) print(质量报告)常见问题与解决方案 ❓Q1: 如何处理混合类型数据的缺失值对于混合类型数据需要分别处理数值型和分类型数据def 处理混合类型缺失值(数据表): 处理混合类型数据的缺失值 处理后的表 数据表.copy() for col in 处理后的表.labels: 列数据 处理后的表.column(col) # 判断列类型 if all(isinstance(x, (int, float)) or np.isnan(x) for x in 列数据): # 数值型列用中位数填充 有效值 [x for x in 列数据 if not np.isnan(x)] if 有效值: 中位数 np.median(有效值) 填充后 [中位数 if np.isnan(x) else x for x in 列数据] 处理后的表 处理后的表.with_column(col, 填充后) else: # 分类型列用众数填充 有效值 [x for x in 列数据 if x is not None and x ! and not (isinstance(x, float) and np.isnan(x))] if 有效值: 计数 {} for val in 有效值: 计数[val] 计数.get(val, 0) 1 众数 max(计数, key计数.get) 填充后 [众数 if (x is None or x or (isinstance(x, float) and np.isnan(x))) else x for x in 列数据] 处理后的表 处理后的表.with_column(col, 填充后) return 处理后的表Q2: 如何批量处理多个数据文件使用datascience库可以轻松批量处理多个CSV文件import os def 批量清洗数据(文件夹路径): 批量清洗指定文件夹中的所有CSV文件 清洗结果 [] for 文件名 in os.listdir(文件夹路径): if 文件名.endswith(.csv): 文件路径 os.path.join(文件夹路径, 文件名) 数据表 Table.read_table(文件路径) # 执行清洗步骤 清洗后的表 处理混合类型缺失值(数据表) # 保存清洗后的数据 输出路径 os.path.join(文件夹路径, f清洗后_{文件名}) 清洗后的表.to_csv(输出路径) 清洗结果.append({ 文件名: 文件名, 原始行数: 数据表.num_rows, 清洗后行数: 清洗后的表.num_rows }) return Table.from_records(清洗结果)总结与进阶学习 通过本文的介绍您已经掌握了使用datascience库进行数据清洗的核心技能。记住数据清洗不是一次性任务而是一个迭代过程。在实际工作中您可能需要多次迭代清洗根据分析结果调整清洗策略自动化清洗流程为重复性任务创建清洗函数建立数据质量监控定期检查数据质量指标datascience库的简洁API设计让数据清洗变得高效而直观。随着您对库的深入了解可以探索更多高级功能如数据聚合、可视化等构建完整的数据分析工作流。开始您的数据清洗之旅吧使用datascience库让数据变得更加干净、可靠为后续的数据分析打下坚实基础。【免费下载链接】datascienceA Python library for introductory data science项目地址: https://gitcode.com/gh_mirrors/dat/datascience创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考