数据分析 —— 数据预处理
一、什么是数据预处理
数据预处理(Data Preprocessing)是数据分析和机器学习中至关重要的步骤,旨在将原始数据转换为更高质量、更适合分析或建模的形式。由于真实世界的数据通常存在不完整、不一致、噪声或冗余等问题,预处理可以帮助提高数据的可用性和模型的性能。
数据预处理的主要步骤
-
数据清洗(Data Cleaning)
-
处理缺失值:填充(均值、中位数、众数等)、删除缺失样本或字段。
-
处理噪声数据:平滑或剔除异常值(如使用分箱、聚类或统计方法)。
-
纠正不一致数据:统一格式(如日期格式、单位)、修正逻辑错误。
-
-
数据集成(Data Integration)
-
合并多个数据源,解决冗余、冲突或重复问题(例如同名不同义的字段)。
-
-
数据变换(Data Transformation)
-
标准化(Standardization):将数据缩放到均值为0、标准差为1(如Z-score)。
-
归一化(Normalization):将数据缩放到固定范围(如[0,1])。
-
离散化(Discretization):将连续数值分段(如年龄分为“青年”“中年”“老年”)。
-
特征编码:将分类变量转换为数值(如独热编码、标签编码)。
-
-
数据归约(Data Reduction)
-
降低数据规模,同时保留关键信息,例如:
-
特征选择:筛选重要特征(如相关系数、随机森林重要性)。
-
降维:使用主成分分析(PCA)、t-SNE等方法压缩维度。
-
-
-
数据分箱(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 (内连接、外连接等)、merge 、concat(axis=1) | UNION 、UNION ALL 、concat(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 中用于将连续型数据划分为离散区间(分箱)的函数,其参数说明如下:
x
- 输入的一维数据(如
Series
、数组或列表),是待分箱的数据源,必须为一维结构。
bins
- 定义分箱的依据,有三种形式:
- 若为 整数,表示将数据等宽划分为指定数量的区间(如
bins=3
表示分成 3 个等宽区间)。- 若为 序列(如
[10, 20, 30]
),按指定边界划分区间(区间默认为左开右闭,如(10,20]
)。- 若为 间隔索引(
IntervalIndex
),需确保区间不重叠。
right
- 布尔值,默认为
True
,表示区间是否包含右边界。
- 例:
bins=[1,2,3]
且right=True
时,区间为(1,2]
、(2,3]
;若right=False
,则为[1,2)
、[2,3)
。
labels
- 为分箱指定标签,需与分箱数量一致。
- 若为 数组,标签直接对应每个区间(如
labels=['低','中','高']
)。- 若为
False
,则返回数据所在区间的整数指示(如0,1,2
表示第 1、2、3 个区间)。
retbins
- 布尔值,默认为
False
。若设为True
,除返回分箱结果外,还会返回区间边界。
precision
- 整数,默认
3
,用于指定区间边界的小数精度(如precision=2
表示保留两位小数)。
include_lowest
- 布尔值,默认为
False
,表示区间左边界是否闭合。
- 例:
bins=[10,20]
且include_lowest=True
时,左区间为[10,20]
(否则为(10,20]
)。
duplicates
- 处理分箱临界值重复的方式,可选
'raise'
(默认,重复时报错)或'drop'
(忽略重复边界)。
2.哑变量处理
哑变量处理(Dummy Variable Treatment)是将分类变量(如性别、职业、商品类别等非数值型变量)转换为若干个二元变量(取值为 0 或 1)的过程。其核心目的是将定性的分类信息转化为数值形式,使机器学习、统计分析等模型能够有效处理这些数据。例如,性别变量有 “男”“女” 两类,可生成一个哑变量(1 代表男,0 代表女);若分类变量有n个类别,通常生成\(n-1\)个哑变量(以其中一个类别作为参照),避免多重共线性。
pd.get_dummies()
是 Pandas 中用于将分类变量转换为哑变量(虚拟变量)的函数,其常见参数如下:
data
- 必选参数,输入需要进行哑变量转换的数据,支持
Series
、DataFrame
或类似数组(array-like
)的结构。
prefix
- 可选参数,用于定义哑变量列名的前缀。可以是字符串、字符串列表或字典(键为列名,值为对应前缀)。例如,设置
prefix='cat'
,生成的哑变量列名可能为cat_类别1
、cat_类别2
。
prefix_sep
- 可选参数,默认为
'_'
,用于连接前缀和原始列名(当前缀存在时)。如prefix='cat'
且prefix_sep='/'
,列名可能为cat/类别1
。
dummy_na
- 可选参数,布尔值,默认为
False
。若设为True
,会为缺失值(NaN
)单独生成一列(值为1
表示该样本为缺失值,否则为0
)。
columns
- 可选参数,指定需要进行哑变量编码的列。若为
None
(默认),则对所有object
、string
或category
数据类型的列进行转换。
sparse
- 可选参数,布尔值,默认为
False
。若设为True
,返回的哑变量数据将以稀疏矩阵形式存储,用于节省内存(适用于大量零值的场景)。
drop_first
- 可选参数,布尔值,默认为
False
。若设为True
,会删除每个分类变量的第一个类别对应的哑变量列,以避免多重共线性(常用于回归分析等场景)。
dtype
- 可选参数,指定生成的哑变量列的数据类型(如
np.uint8
、bool
等),默认为np.uint8
。
以下操作基于上面练习的实操,所需的两个资源已经放在资源包里了
九、预处理二手房数据(综合案例)
1.查看数据1
2.查看数据2
3.数据统一
因为数据表的数据不一致
4.数据合并
5.缺失值处理
6.重复值处理
7.异常值处理
相关文章:

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

软件架构风格系列(4):事件驱动架构
文章目录 前言一、从“用户下单”场景看懂事件驱动核心概念(一)什么是事件驱动架构?(二)核心优势:解耦与异步的双重魔法 二、架构设计图:三要素构建事件流转闭环三、Java实战:从简单…...
windows系统各版本下载
以下各版本Windows系统链接来自网友整理,请通过迅雷或者其他支持ED2K或BT的下载工具进行下载。 注:以下为原版系统,未激活、非破解版,仅供下载体验学习,请勿从事商业活动。 Windows 11 Windows 11 (consumer editions…...

arduino平台读取鼠标光电传感器
鼠标坏掉了,大抵是修不好了。(全剧终—) 但是爱动手的小明不会浪费这个鼠标,确认外观没有明显烧毁痕迹后,尝试从电路板上利用光电传感器进行位移的测量,光电传感器(型号:FCT3065&am…...

【Linux网络】网络层
网络层 在复杂的网络环境中确定一个合适的路径 IP 协议 IPV4 点分十进制[0,255].[0,255].[0,255].[0,255]IPV6 IP地址目标网格目标主机 基本概念 主机:配有IP地址,但是不进行路由控制的设备;路由器:即配有IP地址,又能进行路由控制;节点:主机和路由器的统称。 两个问题 路…...
力扣-98.验证二叉搜索树
题目描述 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 class Solutio…...
5.17本日总结
一、英语 复习list2list29 二、数学 学习14讲部分内容 三、408 学习计组1.2内容 四、总结 高数和计网明天结束当前章节,计网内容学完之后主要学习计组和操作系统 五、明日计划 英语:复习lsit3list28,完成07年第二篇阅读 数学&#…...

大模型学习:Deepseek+dify零成本部署本地运行实用教程(超级详细!建议收藏)
文章目录 大模型学习:Deepseekdify零成本部署本地运行实用教程(超级详细!建议收藏)一、Dify是什么二、Dify的安装部署1. 官网体验2. 本地部署2.1 linux环境下的Docker安装2.2 Windows环境下安装部署DockerDeskTop2.3启用虚拟机平台…...
VSCode launch.json 配置参数详解
使用 launch.json 配置调试环境时,会涉及到多个参数,用于定义调试器的行为和目标执行环境。以下是一些常用的配置参数: 1、"type" :指定调试器的类型,例如 "node" 表示 Node.js 调试器࿰…...
pytest多种断言类型封装为自动化断言规则库
以下是将多种断言类型封装为自动化断言规则库的完整实现方案,包含基础验证规则和扩展机制: import re import time from jsonschema import validate, ValidationError from typing import Dict, Any, Optional, Callableclass ResponseValidator:"""自动...
Oracle数据库如何进行冷备份和恢复
数据库的冷备份指的是数据库处于关闭或者MOUNT状态下的备份,备份文件包括数据文件、日志文件和控制文件。数据库冷备份所用的时间主要受数据库大小和磁盘I/O性能的影响。由于数据库需要关闭才能进行冷备份,所以这种备份技术并不适用724小时的系统。尽管冷…...

LeetCode Hot100 (2、3、4、5、6、8、9、12)
题2--字母异或位分词 class Solution { public:vector<vector<string>> groupAnagrams(vector<string>& strs) {// 一开始的思路是,对于其中的一个单词,遍历所有排序组合,然后判断这些组合是否在哈希表里//࿰…...

FastMCP:为大语言模型构建强大的上下文和工具服务
FastMCP:为大语言模型构建强大的上下文和工具服务 在人工智能快速发展的今天,大语言模型(LLM)已经成为许多应用的核心。然而,如何让这些模型更好地与外部世界交互,获取实时信息,执行特定任务&am…...

数据结构(3)线性表-链表-单链表
我们学习过顺序表时,一旦对头部或中间的数据进行处理,由于物理结构的连续性,为了不覆盖,都得移,就导致时间复杂度为O(n),还有一个潜在的问题就是扩容,假如我们扩容前是10…...

Java Solon v3.3.0 发布(国产优秀应用开发基座)
Solon 框架! Solon 是新一代,Java 企业级应用开发框架。从零开始构建(No Java-EE),有灵活的接口规范与开放生态。采用商用友好的 Apache 2.0 开源协议,是“杭州无耳科技有限公司”开源的根级项目ÿ…...

23种设计模式概述详述(C#代码示例)
文章目录 1. 引言1.1 设计模式的价值1.2 设计模式的分类 2. 面向对象设计原则2.1 单一职责原则 (SRP)2.2 开放封闭原则 (OCP)2.3 里氏替换原则 (LSP)2.4 接口隔离原则 (ISP)2.5 依赖倒置原则 (DIP)2.6 合成复用原则 (CRP)2.7 迪米特法则 (LoD) 3. 创建型设计模式3.1 单例模式 (…...

数字化工厂升级引擎:Modbus TCP转Profinet网关助力打造柔性生产系统
在当今的工业自动化领域,通信协议扮演着至关重要的角色。Modbus TCP和Profinet是两种广泛使用的工业通信协议,它们分别在不同的应用场景中发挥着重要作用。然而,有时我们可能需要将这两种协议进行转换,以实现不同设备之间的无缝通…...

FPGA生成随机数的方法
FPGA生成随机数的方法,目前有以下几种: 1、震荡采样法 实现方式一:通过低频时钟作为D触发器的时钟输入端,高频时钟作为D触发器的数据输入端,使用高频采样低频,利用亚稳态输出随机数。 实现方式二:使用三个…...

【Linux C/C++开发】轻量级关系型数据库SQLite开发(包含性能测试代码)
前言 之前的文件分享过基于内存的STL缓存、环形缓冲区,以及基于文件的队列缓存mqueue、hash存储、向量库annoy存储,这两种属于比较原始且高效的方式。 那么,有没有高级且高效的方式呢。有的,从数据角度上看,࿰…...
2025认证杯第二阶段数学建模B题:谣言在社交网络上的传播思路+模型+代码
2025认证杯数学建模第二阶段思路模型代码,详细内容见文末名片 一、引言 在当今数字化时代,社交网络已然成为人们生活中不可或缺的一部分。信息在社交网络上的传播速度犹如闪电,瞬间就能触及大量用户。然而,这也为谣言的滋生和扩…...

记录算法笔记(2025.5.17)验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1: 输入&…...

flutter编译时 设置jdk版本
先查看flutter使用的版本 flutter doctor -v设置flutter的jdk目录 flutter config --jdk-dir "E:\soft\android-studio\jbr" 然后再验证下,看是否设置成功...

ctfshow——web入门254~258
目录 web入门254 web入门255 web入门256 web入门257 web入门258 反序列化 先来看看其他师傅的讲解 web入门254 源码: <?phperror_reporting(0); highlight_file(__FILE__); include(flag.php);class ctfShowUser{public $usernamexxxxxx;public $passwo…...

【数据处理】xarray 数据处理教程:从入门到精通
目录 xarray 数据处理教程:从入门到精通一、简介**核心优势** 二、安装与导入1. 安装2. 导入库 三、数据结构(一)DataArray(二) Dataset(三)关键说明 四、数据操作(一)索…...

qt5.14.2 opencv调用摄像头显示在label
ui界面添加一个Qlabel名字是默认的label 还有一个button名字是pushButton mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <opencv2/opencv.hpp> // 添加OpenCV头文件 #include <QTimer> // 添加定…...
科技的成就(六十八)
623、杰文斯悖论 杰文斯悖论是1865年经济学家威廉斯坦利杰文斯提出的一悖论:当技术进步提高了效率,资源消耗不仅没有减少,反而激增。例如,瓦特改良的蒸汽机让煤炭燃烧更加高效,但结果却是煤炭需求飙升。 624、代码混…...

芯片生态链深度解析(三):芯片设计篇——数字文明的造物主战争
【开篇:设计——数字文明的“造物主战场”】 当英伟达的H100芯片以576TB/s显存带宽重构AI算力边界,当阿里平头哥倚天710以RISC-V架构实现性能对标ARM的突破,这场围绕芯片设计的全球竞赛早已超越技术本身,成为算法、架构与生态标准…...

Rocky Linux 9.5 基于kubeadm部署k8s
一:部署说明 操作系统https://mirrors.aliyun.com/rockylinux/9.5/isos/x86_64/Rocky-9.5-x86_64-minimal.iso 主机名IP地址配置k8s- master192.168.1.1412颗CPU 4G内存 100G硬盘k8s- node-1192.168.1.1422颗CPU 4G内存 100G硬盘k8s- node-2192.168.1.1432…...
--openssl-legacy-provider is not allowed in NODE_OPTIONS 报错的处理方式
解决方案 Node.js 应用: 从 Node.js v17 开始,底层升级到 OpenSSL 3.0,可能导致旧代码报错(如 ERR_OSSL_EVP_UNSUPPORTED)。 通过以下命令启用旧算法支持: node --openssl-legacy-provider your_script.js…...

uart16550详细说明
一、介绍 uart16550 ip core异步串行通信IP连接高性能的微控制器总线AXI,并为异步串行通信提供了 控制接口。软核设计连接了axilite接口。 二、特性 1.axilite接口用于寄存器访问和数据传输 2.16650串口和16450串口的软件和硬件寄存器都是兼容的 3.默认的core配置参数…...