数据分析 —— 数据预处理

一、什么是数据预处理

数据预处理(Data Preprocessing)是数据分析和机器学习中至关重要的步骤,旨在将原始数据转换为更高质量、更适合分析或建模的形式。由于真实世界的数据通常存在不完整、不一致、噪声或冗余等问题,预处理可以帮助提高数据的可用性和模型的性能。


数据预处理的主要步骤

  1. 数据清洗(Data Cleaning)

    • 处理缺失值:填充(均值、中位数、众数等)、删除缺失样本或字段。

    • 处理噪声数据:平滑或剔除异常值(如使用分箱、聚类或统计方法)。

    • 纠正不一致数据:统一格式(如日期格式、单位)、修正逻辑错误。

  2. 数据集成(Data Integration)

    • 合并多个数据源,解决冗余、冲突或重复问题(例如同名不同义的字段)。

  3. 数据变换(Data Transformation)

    • 标准化(Standardization):将数据缩放到均值为0、标准差为1(如Z-score)。

    • 归一化(Normalization):将数据缩放到固定范围(如[0,1])。

    • 离散化(Discretization):将连续数值分段(如年龄分为“青年”“中年”“老年”)。

    • 特征编码:将分类变量转换为数值(如独热编码、标签编码)。

  4. 数据归约(Data Reduction)

    • 降低数据规模,同时保留关键信息,例如:

      • 特征选择:筛选重要特征(如相关系数、随机森林重要性)。

      • 降维:使用主成分分析(PCA)、t-SNE等方法压缩维度。

  5. 数据分箱(Binning)

    • 将连续值划分为区间,减少噪声影响(如将收入分为“低、中、高”)。


数据预处理的目的

  • 提高数据质量:消除噪声、错误和不一致性。

  • 提升模型性能:通过标准化、归一化等手段优化数据分布。

  • 减少计算成本:降维和归约可加速模型训练。

  • 适配算法需求:许多算法对输入数据的格式和范围敏感(如神经网络需要归一化)。


举例说明

  • 原始数据问题:某用户年龄字段包含“-1”(异常值),收入字段有缺失。

  • 预处理后:删除“-1”,用中位数填充缺失值,并对收入进行归一化处理。

数据预处理是数据科学流程中不可或缺的环节,直接影响最终结果的可靠性和模型效果。

二、数据检测

1.准备数据

2.查看NaN值

方法一:

isnull():是查看数据是否存在NaN值,如果有则返回True

方法二:

notnull():是查数据是否不存在NaN值,如果不存在则返回True

三、缺失值处理

1.查看缺失值的占比

2.提取出完整的数据

这里使用另外一组数据

3.清除全空值

  • dropna 是 Pandas 中 DataFrame 的一个方法,用于删除包含缺失值(NaN)的行或列,目的是清理数据中的无效缺失信息。
  • how 是 dropna 方法的一个参数,用于指定删除行或列的条件:
    • 当 how='any' 时,只要行或列中 存在任意一个 NaN,就删除该行或列。
    • 当 how='all' 时,仅当行或列中 所有值都为 NaN 时,才删除该行或列。

4.筛选非空值数

5.某一列 = NaN,删除整行数据

6.缺失值的替换处理

7.缺失值的填充处理

  • fillna 是 Pandas 中 DataFrame 的一个方法,用于填充数据中的缺失值(NaN),其常见属性(参数)包括 value(填充的具体值)、method(填充方法)、axis(指定轴,0 或 'index' 表示行,1 或 'columns' 表示列)等。
  • method 是 fillna 方法的一个参数,用于指定填充缺失值的具体方法:
    • 'ffill'forward - fill 的缩写)表示向前填充,即用缺失值前面(按指定轴方向)的非缺失值来填充当前缺失值。例如,若按行方向(axis=0),则用同一列中上方的非缺失值填充下方缺失值;若按列方向(axis=1),则用同一行中前方的非缺失值填充后方缺失值。
    • 另一种常见值是 'bfill'backward - fill 的缩写),表示向后填充,即用缺失值后面(按指定轴方向)的非缺失值来填充当前缺失值。

因为是向上填充,第一行已是最初数据,无法填充 

向下填充

四、重复值处理

1.查看重复值

2.删除重复值数据

五、异常值处理

1.异常值替换

存在23和50替换成3和2

2.三西格玛法则

three_sigma(df_obj['A']):对 df_obj 数据框中的 'A' 列应用 three_sigma 函数,输出为 6 30 Name: A, dtype: int64,表明 'A' 列中存在符合三西格玛法则判定的异常值(这里显示为 6 和 30)。

three_sigma(df_obj['B']):对 df_obj 数据框中的 'B' 列应用该函数,输出为 Series([], Name: B, dtype: int64),表示 'B' 列中没有符合三西格玛法则判定的异常值,返回一个空的 Series。

3.箱形图检测

六、数据合并

维度横向堆叠(列合并)纵向堆叠(行合并)
方向左右扩展(新增列)上下扩展(新增行)
核心操作JOIN(内连接、外连接等)、mergeconcat(axis=1)UNIONUNION ALLconcat(axis=0)
关键条件需通过 “键” 对齐列(可能存在列名冲突)需列结构一致(列数、列名相同或可自动对齐)
连接策略外连接(横向操作)内连接(横向操作)
保留记录至少一个表的所有记录,未匹配列填 NULL仅保留两表连接键完全匹配的记录
典型场景保留所有数据(如客户全量信息,无论是否有消费记录)筛选交集数据(如同时存在于两个表中的用户)

总结

  • 横向堆叠是列合并,外连接是横向合并时保留非匹配记录的策略;
  • 纵向堆叠是行合并,与内连接无直接关联(内连接属于横向合并的匹配策略)。
  • 混淆点:内连接本质是横向操作(列合并 + 筛选行),而纵向堆叠是单纯的行追加,两者分属不同数据合并维度。
pd.concat(objs,                # 需要合并的对象列表(DataFrame/Series)axis=0,              # 合并方向:0=纵向(默认),1=横向join='outer',        # 连接方式:'outer'(默认)外连接(并集)或 'inner'内连接(交集)ignore_index=False,  # 是否重置索引keys=None,           # 创建多层索引sort=False,          # 是否对列排序(axis=1 时)verify_integrity=False  # 是否检查重复索引
)

1.横向堆叠与外连接(并集)

2.纵向堆叠与内连接(交集)

3.主键合并

pd.merge(left,                # 左侧 DataFrameright,               # 右侧 DataFramehow='inner',         # 连接方式:'inner'(默认)、'outer'、'left'、'right'on=None,             # 用于连接的列名(必须同时存在于左右 DataFrame 中)left_on=None,        # 左侧 DataFrame 中用于连接的列right_on=None,       # 右侧 DataFrame 中用于连接的列left_index=False,    # 是否使用左侧 DataFrame 的索引作为键right_index=False,   # 是否使用右侧 DataFrame 的索引作为键suffixes=('_x', '_y') # 用于区分重复列的后缀
)

与其他合并函数的对比

函数核心特点适用场景
pd.merge()按键连接,支持多种连接类型(SQL 风格)基于共同列合并数据
pd.concat()按行 / 列堆叠,支持多层索引快速合并同结构数据
df.join()基于索引的快速合并(默认左连接)按索引合并多个 DataFrame

内连接规则:仅保留 'key' 列在两表中都存在的值(K0 和 K2),以 left 的 key 为主,找共同有的元素

4.笛卡尔连接

关键点:on=‘key’

5.左连接合并

6.根据索引合并

为什么C和D的值的NaN?因为 right 的标签的 abc,不是012

7.合并重叠数据

基本语法

df1.combine_first(df2)  # 用 df2 的值填充 df1 的缺失值

注意:right的标签顺序

七、数据重塑

方法转换方向作用
stack()列 → 行(宽 → 长)将列标签转为行索引(多级索引)
unstack()行 → 列(长 → 宽)将行索引转为列标签(常用于逆操作)
melt()多列 → 两列(id_vars + value_vars)将指定列保留为标识符,其余列转为值列

1.stack()方法

2.unstack()方法

3.重塑旋转

future_stack=True 是 Pandas 2.1.0 版本引入的一个参数,用于启用 stack() 方法的新实现逻辑。这个参数的出现是为了平滑过渡到未来版本中默认的 stack() 行为,避免旧代码在升级后产生意外结果。

新旧实现的核心差异

场景旧实现( 默认 stack() )新实现 stack(future_stack=True)
处理缺失值(NaN)可能静默丢弃或保留 NaN,取决于索引对齐方式严格保留所有索引,未匹配的值用 NaN 填充
多级索引堆叠行为较宽松,可能导致索引层级混乱强制保持索引层级的一致性,避免潜在的歧义
重复列名处理允许重复列名,堆叠后可能生成重复的索引强制要求列名唯一(否则抛出 ValueError
性能优化某些情况下可能较慢优化了内存使用和计算效率

level=1 表示对列索引的第二层(“A 教室”“B 教室” 这一层)进行堆叠

关键差异总结

参数堆叠层级结果索引层级列维度保留情况
level=-1(默认)所有列索引层级原行索引 + 所有列层级无(全部转为行)
level=1仅第 1 层列索引原行索引 + 第 1 层列索引第 0 层列索引保留为列

核心作用

  • 列转行:将 DataFrame 中指定层级的列索引(若有多级列索引)移动到行索引,形成多级行索引。
  • 结构转换:例如,原数据中某几列代表不同分类的指标,堆叠后这些分类指标转为行的一部分,数据整体更 “长” 更 “窄”。

4.轴向旋转


pivot() 是数据处理中用于重塑数据结构的函数,常见于 Pandas 库,作用类似 “透视表”,能将数据从长格式转换为宽格式,便于分析。

Pandas 中 pivot() 的语法与参数

  • 语法pivot(index=None, columns=None, values=None) → DataFrame
  • 参数说明
    • index:指定一列作为新 DataFrame 的行索引。
    • columns:指定一列的值作为新 DataFrame 的列名(必须传值)。
    • values:指定一列作为新 DataFrame 的值(可选,若省略,原 DataFrame 的列会保留在结果中)。

形成一个直观的手机降价对比图

八、数据转换

1.面元划分

pd.cut() 是 Pandas 库中用于将连续型数值数据切分为离散区间(分箱)的函数,常用于数据预处理、分组分析或可视化。通过设定区间规则,它能将连续值转换为分类数据(如将年龄分为 “青年”“中年”“老年”),便于进一步分析。

pd.cut() 是 Pandas 中用于将连续型数据划分为离散区间(分箱)的函数,其参数说明如下:

  1. x

    • 输入的一维数据(如 Series、数组或列表),是待分箱的数据源,必须为一维结构。
  2. bins

    • 定义分箱的依据,有三种形式:
      • 若为 整数,表示将数据等宽划分为指定数量的区间(如 bins=3 表示分成 3 个等宽区间)。
      • 若为 序列(如 [10, 20, 30]),按指定边界划分区间(区间默认为左开右闭,如 (10,20])。
      • 若为 间隔索引IntervalIndex),需确保区间不重叠。
  3. right

    • 布尔值,默认为 True,表示区间是否包含右边界。
      • 例:bins=[1,2,3] 且 right=True 时,区间为 (1,2](2,3];若 right=False,则为 [1,2)[2,3)
  4. labels

    • 为分箱指定标签,需与分箱数量一致。
      • 若为 数组,标签直接对应每个区间(如 labels=['低','中','高'])。
      • 若为 False,则返回数据所在区间的整数指示(如 0,1,2 表示第 1、2、3 个区间)。
  5. retbins

    • 布尔值,默认为 False。若设为 True,除返回分箱结果外,还会返回区间边界。
  6. precision

    • 整数,默认 3,用于指定区间边界的小数精度(如 precision=2 表示保留两位小数)。
  7. include_lowest

    • 布尔值,默认为 False,表示区间左边界是否闭合。
      • 例:bins=[10,20] 且 include_lowest=True 时,左区间为 [10,20](否则为 (10,20])。
  8. duplicates

    • 处理分箱临界值重复的方式,可选 'raise'(默认,重复时报错)或 'drop'(忽略重复边界)。

2.哑变量处理

哑变量处理(Dummy Variable Treatment)是将分类变量(如性别、职业、商品类别等非数值型变量)转换为若干个二元变量(取值为 0 或 1)的过程。其核心目的是将定性的分类信息转化为数值形式,使机器学习、统计分析等模型能够有效处理这些数据。例如,性别变量有 “男”“女” 两类,可生成一个哑变量(1 代表男,0 代表女);若分类变量有n个类别,通常生成\(n-1\)个哑变量(以其中一个类别作为参照),避免多重共线性。

pd.get_dummies() 是 Pandas 中用于将分类变量转换为哑变量(虚拟变量)的函数,其常见参数如下:

  1. data

    • 必选参数,输入需要进行哑变量转换的数据,支持 SeriesDataFrame 或类似数组(array-like)的结构。
  2. prefix

    • 可选参数,用于定义哑变量列名的前缀。可以是字符串、字符串列表或字典(键为列名,值为对应前缀)。例如,设置 prefix='cat',生成的哑变量列名可能为 cat_类别1cat_类别2
  3. prefix_sep

    • 可选参数,默认为 '_',用于连接前缀和原始列名(当前缀存在时)。如 prefix='cat' 且 prefix_sep='/',列名可能为 cat/类别1
  4. dummy_na

    • 可选参数,布尔值,默认为 False。若设为 True,会为缺失值(NaN)单独生成一列(值为 1 表示该样本为缺失值,否则为 0)。
  5. columns

    • 可选参数,指定需要进行哑变量编码的列。若为 None(默认),则对所有 objectstring 或 category 数据类型的列进行转换。
  6. sparse

    • 可选参数,布尔值,默认为 False。若设为 True,返回的哑变量数据将以稀疏矩阵形式存储,用于节省内存(适用于大量零值的场景)。
  7. drop_first

    • 可选参数,布尔值,默认为 False。若设为 True,会删除每个分类变量的第一个类别对应的哑变量列,以避免多重共线性(常用于回归分析等场景)。
  8. dtype

    • 可选参数,指定生成的哑变量列的数据类型(如 np.uint8bool 等),默认为 np.uint8

以下操作基于上面练习的实操,所需的两个资源已经放在资源包里了

 九、预处理二手房数据(综合案例)

1.查看数据1

2.查看数据2

3.数据统一

因为数据表的数据不一致

4.数据合并

5.缺失值处理

6.重复值处理

7.异常值处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/80813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Redis】哨兵(Sentinel)机制

文章目录 1. Redis Sentinel的概念1.1 基本概念1.2 引出高可用 2. Redis Sentinel的部署(基于docker)2.1 部署2.2 验证2.3 选举流程 Redis 的主从复制模式下,⼀旦主节点由于故障不能提供服务,需要人工进行主从切换,同时…

初识Linux · 五种IO模型和非阻塞IO

目录 前言: 五种IO模型 什么是IO IO模型 非阻塞IO 前言: 前文我们已经将网络的基本原理介绍完了,都是通过围绕TCP/IP四层协议,将应用层,传输层,网络层,数据链路层全部介绍完毕&#xff0c…

Node.js 24发布:性能与安全双提升

在科技的迅速发展中,Node.js作为一个备受青睐的开源跨平台Java运行环境,近日迎来了其24.0版本的正式发布。此次更新不仅承诺提升性能和安全性,还为开发者提供了更为顺畅的开发体验,值得我们深入探讨。 Node.js 24.0的最大亮点之一…

SLAM文献之-SuperOdometry: Lightweight LiDAR-inertial Odometry and Mapping

《Super Odometry: IMU-centric LiDAR-Visual-Inertial Estimator for Challenging Environments》是一篇旨在增强 SLAM 系统在恶劣环境下鲁棒性的工作,尤其关注尘雾、烟雾等遮挡条件下的鲁棒估计。下面从算法原理、公式推导、创新点和应用场景四个方面进行详细解析…

指令烧录ORIN NANO操作系统

1 概述 模组为ORIN NANO 4GB版本 Ubuntu系统为18.04虚拟机 说明:刷机过程会有重新连接USB的操作,烧写过程需要注意虚拟机提示,官方不建议使用虚拟机,建议直接使用ubuntu操作系统的机器。 2 下载烧录所需文件 进入到下载网址&am…

游戏引擎学习第287天:加入brain逻辑

Blackboard:动态控制类似蛇的多节实体 我们目前正在处理一个关于实体系统如何以组合方式进行管理的问题。具体来说,是在游戏中实现多个实体可以共同或独立行动的机制。例如,我们的主角拥有两个实体组成部分,一个是身体&#xff0…

QML定时器Timer和线程任务WorkerScript

定时器 Timer 属性 interval: 事件间隔毫秒repeat: 多次执行,默认只执行一次running: 定时器启动triggeredOnStart: 定时器启动时立刻触发一次事件 信号 triggered(): 定时时间到,触发此信号 方法 restart(): 重启定时器start(): 启动定时器stop(): 停止…

Linux中的域名解析服务器

一、DNS(域名系统)详解 1. 核心功能与特点 特性说明核心作用将域名(如 www.example.com)转换为 IP 地址(如 192.168.1.1),实现人类可读地址与机器可读地址的映射。端口与协议- 默认端口&#…

Springboot2

1、搭建环境 2、配置文件 application.properties application.yml 3、springboot接收请求 springspringmvc 接收请求 响应数据 4、springboot集成jdbc spring-boot-starter-jdbc.jar JdbcTemplate(update|query) 5、springboot自动装配原理(重点&#x…

【课堂笔记】核方法和Mercer定理

文章目录 Kernal引入定义Mercer定理描述有限情形证明一般情形证明 Kernal 引入 在实际数据中常常遇到不可线性分割的情况,此时通常需要将其映射到高维空间中,使其变得线性可分。例如二维数据: 通过映射 ϕ ( x 1 , x 2 ) ( x 1 2 , 2 x 1…

谈谈未来iOS越狱或巨魔是否会消失

2024年10月的预测,先说结论: 巨魔iOS17.1消失概率为99%。 因为巨魔强依赖的漏洞就是一个签名漏洞,攻击面有限又经过2轮修复,第3次出现漏洞的概率极低。而越狱的话由于系统组件和服务较多,所以出现漏洞概率高攻击面多&…

根据当前日期计算并选取上一个月和上一个季度的日期范围,用于日期控件的快捷选取功能

1.选择月份范围 代码如下&#xff1a; <el-date-picker v-model"value" type"monthrange" align"right" unlink-panels range-separator"至"start-placeholder"开始月份" end-placeholder"结束月份" :picker-…

用户栈的高效解析逻辑

一、背景 在之前的博客 内核逻辑里抓取用户栈的几种方法-CSDN博客 里&#xff0c;介绍了使用内核逻辑进行用户栈的函数地址的抓取逻辑&#xff0c;但是并没有涉及如何解析出函数符号的逻辑。 就如perf工具一样&#xff0c;它也是分为两个步骤&#xff0c;一个步骤是内核态抓取…

vue3 el-table 行号

在 Vue 3 中&#xff0c;使用 Element Plus 的 <el-table> 组件来创建表格时&#xff0c;如果你想添加行号&#xff08;即每一行的编号&#xff09;&#xff0c;可以通过自定义列来实现。下面是如何实现的步骤&#xff1a; 1. 安装 Element Plus 首先&#xff0c;确保你…

Linux:进程信号---信号的保存与处理

文章目录 1. 信号的保存1.1 信号的状态管理 2. 信号的处理2.1 用户态与内核态2.2 信号处理和捕捉的内核原理2.3 sigaction函数 3. 可重入函数4. Volatile5. SIGCHLD信号 序&#xff1a;在上一章中&#xff0c;我们对信号的概念及其识别的底层原理有了一定认识&#xff0c;也知道…

UML 图的细分类别及其应用

统一建模语言&#xff08;UML&#xff0c;Unified Modeling Language&#xff09;是一种用于软件系统建模的标准化语言&#xff0c;广泛应用于软件工程领域。UML 图分为多种类别&#xff0c;每种图都有其特定的用途和特点。本文将详细介绍 UML 图的细分类别&#xff0c;包括 类…

「极简」扣子(coze)教程 | 小程序UI设计进阶!控件可见性设置

大师兄在上一期的内容中对用户的UI做了一些简单的介绍。这期大师兄继续介绍UI设计上的进阶小技巧&#xff0c;帮我们获得更好的使用体验。 扣子&#xff08;coze&#xff09;编程 「极简」扣子(coze)教程 | 3分钟学会小程序UI设计&#xff01;从零开始创建页面和瓷片按钮 「极…

2025年渗透测试面试题总结-快手[实习]安全工程师(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 快手[实习]安全工程师 一面问题分析与详细回答 1. 自我介绍 4. 项目问题与解决 7. 防止SQL注入&…

WordPress Madara插件存在文件包含漏洞(CVE-2025-4524)

免责声明 本文档所述漏洞详情及复现方法仅限用于合法授权的安全研究和学术教育用途。任何个人或组织不得利用本文内容从事未经许可的渗透测试、网络攻击或其他违法行为。使用者应确保其行为符合相关法律法规,并取得目标系统的明确授权。 对于因不当使用本文信息而造成的任何直…

互联网大厂Java面试场景:从Spring Boot到分布式缓存技术的探讨

互联网大厂Java面试场景&#xff1a;从Spring Boot到分布式缓存技术的探讨 场景描述 互联网大厂某次Java开发岗面试&#xff0c;主考官是一位严肃的技术专家&#xff0c;而应聘者则是搞笑的程序员“码农明哥”。面试围绕音视频场景的技术解决方案展开&#xff0c;探讨从Sprin…