当前位置: 首页 > news >正文

Python Pandas(7):Pandas 数据清洗

        数据清洗是对一些没有用的数据进行处理的过程。很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要使数据分析更加准确,就需要对这些没有用的数据进行处理。数据清洗与预处理的常见步骤:

  1. 缺失值处理:识别并填补缺失值,或删除含缺失值的行/列。
  2. 重复数据处理:检查并删除重复数据,确保每条数据唯一。
  3. 异常值处理:识别并处理异常值,如极端值、错误值。
  4. 数据格式转换:转换数据类型或进行单位转换,如日期格式转换。
  5. 标准化与归一化:对数值型数据进行标准化(如 Z-score)或归一化(如 Min-Max)。
  6. 类别数据编码:将类别变量转换为数值形式,常见方法包括 One-Hot 编码和标签编码。
  7. 文本处理:对文本数据进行清洗,如去除停用词、词干化、分词等。
  8. 数据抽样:从数据集中抽取样本,或通过过采样/欠采样处理类别不平衡。
  9. 特征工程:创建新特征、删除不相关特征、选择重要特征等。

        本文使用到的测试数据 property-data.csv 如下:

        上表包含了四种空数据:

  • n/a
  • NA
  • na

1 Pandas 清洗空值

        如果我们要删除包含空字段的行,可以使用 dropna() 方法,语法格式如下:

DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
  • axis:默认为 0,表示逢空值剔除整行,如果设置参数 axis=1 表示逢空值去掉整列。
  • how:默认为 'any' 如果一行(或一列)里任何一个数据有出现 NA 就去掉整行,如果设置 how='all' 一行(或列)都是 NA 才去掉这整行。
  • thresh:设置需要多少非空值的数据才可以保留下来的。
  • subset:设置想要检查的列。如果是多个列,可以使用列名的 list 作为参数。
  • inplace:如果设置 True,将计算得到的值直接覆盖之前的值并返回 None,修改的是源数据。

1.1  isnull() 判断各个单元格是否为空

        我们可以通过 isnull() 判断各个单元格是否为空。

import pandas as pddf = pd.read_csv('property-data.csv')print(df['NUM_BEDROOMS'])
print(df['NUM_BEDROOMS'].isnull())

        以上例子中我们看到 Pandas 没有把 n/a 和 NA 当作空数据,不符合我们要求,我们可以指定空数据类型:

import pandas as pdmissing_values = ["n/a", "na", "--"]
df = pd.read_csv('property-data.csv', na_values=missing_values)print(df['NUM_BEDROOMS'])
print(df['NUM_BEDROOMS'].isnull())

1.2 dropna() 删除包含空数据的行

        接下来的实例演示了删除包含空数据的行。

import pandas as pddf = pd.read_csv('property-data.csv')new_df = df.dropna()print(new_df.to_string())

        默认情况下,dropna() 方法返回一个新的 DataFrame,不会修改源数据。如果你要修改源数据 DataFrame, 可以使用 inplace = True 参数:

df.dropna(inplace = True)

        我们也可以移除指定列有空值的行:

import pandas as pddf = pd.read_csv('property-data.csv')df.dropna(subset=['ST_NUM'], inplace=True)print(df.to_string())

1.3  fillna() 替换空字段

        我们也可以 fillna() 方法来替换一些空字段:

import pandas as pddf = pd.read_csv('property-data.csv')df.fillna(12345, inplace=True)print(df.to_string())

        我们也可以指定某一个列来替换数据,例如使用 12345 替换 PID 为空数据:

df.fillna({ 'PID' : 12345 }, inplace = True)

        替换空单元格的常用方法是计算列的均值、中位数值或众数。Pandas使用 mean()、median() 和 mode() 方法计算列的均值(所有值加起来的平均值)、中位数值(排序后排在中间的数)和众数(出现频率最高的数)。

1.3.1 mean() 均值替换

import pandas as pddf = pd.read_csv('property-data.csv')x = df["ST_NUM"].mean()
df.fillna({ 'ST_NUM': x }, inplace=True)
print(df.to_string())

        以上实例输出结果如下,红框为计算的中位数替换来空单元格: 

1.3.2 median() 中位数替换

import pandas as pddf = pd.read_csv('property-data.csv')
x = df["ST_NUM"].median()
df.fillna({'ST_NUM': x}, inplace=True)
print(df.to_string())

1.3.3 mode() 众数替换

import pandas as pddf = pd.read_csv('property-data.csv')x = df["ST_NUM"].mode()
df.fillna({'ST_NUM': x.values[0]}, inplace=True)
print(df.to_string())

        mode()可能会出现多个值,所以需要用values[index]指定。

2 Pandas 清洗格式错误数据

        数据格式错误的单元格会使数据分析变得困难,甚至不可能。我们可以通过包含空单元格的行,或者将列中的所有单元格转换为相同格式的数据。以下实例会格式化日期:

import pandas as pd# 第三个日期格式错误
data = {"Date": ['2020/12/01', '2020/12/02', '20201226'],"duration": [50, 40, 45]
}df = pd.DataFrame(data, index=["day1", "day2", "day3"])df['Date'] = pd.to_datetime(df['Date'], format='mixed')print(df.to_string())

3 Pandas 清洗错误数据

        数据错误也是很常见的情况,我们可以对错误的数据进行替换或移除。以下实例会替换错误年龄的数据:

import pandas as pdperson = {"name": ['Google', 'Bing', 'Taobao'],"age": [50, 40, 12345]  # 12345 年龄数据是错误的
}df = pd.DataFrame(person)df.loc[2, 'age'] = 30  # 修改数据print(df.to_string())

        也可以设置条件语句,例如将 age 大于 120 的设置为 120:

import pandas as pdperson = {"name": ['Google', 'Bing', 'Taobao'],"age": [50, 200, 12345]
}df = pd.DataFrame(person)for x in df.index:if df.loc[x, "age"] > 120:df.loc[x, "age"] = 120print(df.to_string())

        也可以将错误数据的行删除,例如将 age 大于 120 的删除:

import pandas as pdperson = {"name": ['Google', 'Runoob', 'Taobao'],"age": [50, 40, 12345]  # 12345 年龄数据是错误的
}df = pd.DataFrame(person)for x in df.index:if df.loc[x, "age"] > 120:df.drop(x, inplace=True)print(df.to_string())

4 Pandas 清洗重复数据

        如果我们要清洗重复数据,可以使用 duplicated() 和 drop_duplicates() 方法。如果对应的数据是重复的,duplicated() 会返回 True,否则返回 False。

import pandas as pdperson = {"name": ['Google', 'Bing', 'Bing', 'Taobao'],"age": [50, 40, 40, 23]
}
df = pd.DataFrame(person)print(df.duplicated())

        删除重复数据,可以直接使用drop_duplicates() 方法。

import pandas as pdperson = {"name": ['Google', 'Bing', 'Bing', 'Taobao'],"age": [50, 40, 40, 23]
}
df = pd.DataFrame(person)df.drop_duplicates(inplace=True)
print(df)

5 常用方法及说明

操作方法/步骤说明常用函数/方法
缺失值处理填充缺失值使用指定的值(如均值、中位数、众数等)填充缺失值。df.fillna(value)
删除缺失值删除包含缺失值的行或列。df.dropna()
重复数据处理删除重复数据删除 DataFrame 中的重复行。df.drop_duplicates()
异常值处理异常值检测(基于统计方法)通过 Z-score 或 IQR 方法识别并处理异常值。自定义函数(如基于 Z-score 或 IQR)
替换异常值使用合适的值(如均值或中位数)替换异常值。自定义函数(如替换异常值)
数据格式转换转换数据类型将数据类型从一个类型转换为另一个类型,如将字符串转换为日期。df.astype()
日期时间格式转换转换字符串或数字为日期时间类型。pd.to_datetime()
标准化与归一化标准化将数据转换为均值为0,标准差为1的分布。StandardScaler()
归一化将数据缩放到指定的范围(如 [0, 1])。MinMaxScaler()
类别数据编码标签编码将类别变量转换为整数形式。LabelEncoder()
独热编码(One-Hot Encoding)将每个类别转换为一个新的二进制特征。pd.get_dummies()
文本数据处理去除停用词从文本中去除无关紧要的词,如 "the" 、 "is" 等。自定义函数(基于 nltk 或 spaCy
词干化与词形还原提取词干或恢复单词的基本形式。nltk.stem.PorterStemmer()
分词将文本分割成单词或子词。nltk.word_tokenize()
数据抽样随机抽样从数据中随机抽取一定比例的样本。df.sample()
上采样与下采样通过过采样(复制少数类样本)或欠采样(减少多数类样本)来平衡数据集中的类别分布。SMOTE()(上采样); RandomUnderSampler()(下采样)
特征工程特征选择选择对目标变量有影响的特征,去除冗余或无关特征。SelectKBest()
特征提取从原始数据中创建新的特征,提升模型的预测能力。PolynomialFeatures()
特征缩放对数值特征进行缩放,使其具有相同的量级。MinMaxScaler() 、 StandardScaler()
类别特征映射特征映射将类别变量映射为对应的数字编码。自定义映射函数
数据合并与连接合并数据将多个 DataFrame 按照某些列合并在一起,支持内连接、外连接、左连接、右连接等。pd.merge()
连接数据将多个 DataFrame 进行行或列拼接。pd.concat()
数据重塑数据透视表将数据根据某些维度进行分组并计算聚合结果。pd.pivot_table()
数据变形改变数据的形状,如从长格式转为宽格式或从宽格式转为长格式。df.melt() 、 df.pivot()
数据类型转换与处理字符串处理对字符串数据进行处理,如去除空格、转换大小写等。str.replace() 、 str.upper() 等
分组计算按照某个特征分组后进行聚合计算。df.groupby()
缺失值预测填充使用模型预测填充缺失值使用机器学习模型(如回归模型)预测缺失值,并填充缺失数据。自定义模型(如 sklearn.linear_model.LinearRegression
时间序列处理时间序列缺失值填充使用时间序列的方法(如前向填充、后向填充)填充缺失值。df.fillna(method='ffill')
滚动窗口计算使用滑动窗口进行时间序列数据的统计计算(如均值、标准差等)。df.rolling(window=5).mean()
数据转换与映射数据映射与替换将数据中的某些值替换为其他值。df.replace()

相关文章:

Python Pandas(7):Pandas 数据清洗

数据清洗是对一些没有用的数据进行处理的过程。很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要使数据分析更加准确,就需要对这些没有用的数据进行处理。数据清洗与预处理的常见步骤: 缺失值处理:识别并…...

南京观海微电子----整流滤波电路实用

01 变压电路 通常直流稳压电源使用电源变压器来改变输入到后级电路的电压。电源变压器由初级绕组、次级绕组和铁芯组成。初级绕组用来输入电源交流电压,次级绕组输出所需要的交流电压。通俗的说,电源变压器是一种电→磁→电转换器件。即初级的交流电转化…...

【python】向Jira测试计划下,附件中增加html测试报告

【python】连接Jira获取token以及jira对象 # 往 jira 测试计划下面,上传测试结果html def put_jira_file(plain_id):# 配置连接jiraconn ConnJira()jira conn.jira_login()[2]path jira.issue(O45- plain_id)attachments_dir os.path.abspath(..) \\test_API…...

探索ChatGPT背后的前端黑科技

由于图片和格式解析问题,可前往 阅读原文 在人工智能与互联网技术飞速发展的今天,像ChatGPT这样的智能对话系统已经成为科技领域的焦点。它不仅能够进行自然流畅的对话,还能以多种格式展示内容,为用户带来高效且丰富的交互体验。然…...

Agents Go Deep 智能体深入探索

Agents Go Deep 智能体深入探索 核心事件 OpenAI发布了一款先进的智能体“深度研究”,它能借助网络搜索和推理生成研究报告。 最新进展 功能特性:该智能体依据数百个在线资源生成详细报告,目前仅支持文本输出,不过很快会增加对图…...

DeepSeek全生态接入指南:官方通道+三大云平台

DeepSeek全生态接入指南:官方通道三大云平台 一、官方资源入口 1.1 核心交互平台 🖥️ DeepSeek官网: https://chat.deepseek.com/ (体验最新对话模型能力) 二、客户端工具 OllamaChatboxCherry StudioAnythingLLM …...

c++TinML转html

cTinML转html 前言解析解释转译html类定义开头html 结果这是最终效果(部分): ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6cf6c3e3c821446a84ae542bcc2652d4.png) 前言 在python.tkinter设计标记语言(转译2-html)中提到了将Ti…...

STM32硬件SPI函数解析与示例

1. SPI 简介 SPI(Serial Peripheral Interface)即串行外设接口,是一种高速、全双工、同步的通信总线,常用于微控制器与各种外设(如传感器、存储器等)之间的通信。STM32 系列微控制器提供了多个 SPI 接口&a…...

滤波器:卡尔曼滤波

卡尔曼滤波(Kalman Filter)是一种高效的递归算法,主要用于动态系统的状态估计。它通过结合系统模型和噪声干扰的观测数据,实现对系统状态的最优估计(在最小均方误差意义下)。以下从原理、使用场景和特点三个…...

深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决

在深度学习框架中,TensorFlow 和 PyTorch 无疑是两大明星框架。前面两篇文章我们分别介绍了 TensorFlow(点击查看) 和 PyTorch(点击查看)。它们引领着 AI 开发的潮流,吸引着无数开发者投身其中。但这两大框…...

Windows环境管理多个node版本

前言 在实际工作中,如果我们基于Windows系统开发,同时需要维护老项目,又要开发新项目,且不同项目依赖的node版本又不同时,那么就需要根据项目切换不同的版本。本文使用Node Version Manager(nvm&#xff0…...

opencascade 源码学习BRepBuilderAPI-BRepBuilderAPI

BRepBuilderAPI BRepBuilderAPI 是一个用于构建和操作 BRep(边界表示法,Boundary Representation)拓扑数据结构的工具类。它提供了高级接口,用于创建几何形状(如顶点、边、面、实体等)以及进行扫掠&#x…...

Vue 2 + Webpack 项目中集成 ESLint 和 Prettier

在 Vue 2 Webpack 项目中集成 ESLint 和 Prettier 可以帮助你规范代码风格并自动格式化代码。以下是详细的步骤: 1. 安装 ESLint 和 Prettier 相关依赖 在项目根目录下运行以下命令,安装 ESLint、Prettier 和相关插件: npm install --save…...

Renesas RH850 EEL库的优点

文章目录 1. 磨损均衡(Wear Leveling)2. 数据抽象与易用性3. 后台维护与自动刷新4. 多优先级操作5. ECC 错误处理与数据完整性EEL 与 FDL 的协作机制1. 分层架构2. 存储池划分3. 协作流程4. 同步与互斥5. 性能优化实际应用场景示例场景:车辆里程存储总结1. 磨损均衡(Wear L…...

torch导出ONNX模型报错:OnnxExporterError: Module onnx is not installed

问题: 使用torch 导出模型为onnx文件时报错:torch.onnx.OnnxExporterError: Module onnx is not installed! 环境: 操作系统 Win10 python运行环境 Anacoda3 torch 2.6.0 torchvision …...

LabVIEW 用户界面设计基础原则

在设计LabVIEW VI的用户界面时,前面板的外观和布局至关重要。良好的设计不仅提升用户体验,还能提升界面的易用性和可操作性。以下是设计用户界面时的一些关键要点: 1. 前面板设计原则 交互性:组合相关的输入控件和显示控件&#x…...

使用Python爬虫实时监控行业新闻案例

目录 背景环境准备请求网页数据解析网页数据定时任务综合代码使用代理IP提升稳定性运行截图与完整代码总结 在互联网时代,新闻的实时性和时效性变得尤为重要。很多行业、技术、商业等领域的新闻都可以为公司或者个人发展提供有价值的信息。如果你有一项需求是要实时…...

qt QTextEdit用法总结

1. 基本介绍 QTextEdit 是 Qt 中用于显示和编辑富文本(支持 HTML 子集)和纯文本的控件。 支持文本格式(字体、颜色、对齐)、列表、表格、图片插入等富文本功能。 底层通过 QTextDocument 管理内容,提供强大的文本处理…...

《open3d qt 网格采样成点云》

open3d qt 网格采样成点云 效果展示二、流程三、代码效果展示 二、流程 创建动作,链接到槽函数,并把动作放置菜单栏 参照前文 三、代码 1、槽函数实现 void on_actionMeshUniformSample_triggered();//均匀采样 void MainWindow::...

企业数据安全:切实有效的数据安全保障措施分享:

确保企业数据安全是一项持续不懈的任务,鉴于技术的飞速发展,网络攻击者持续探索新型手段以窃取敏感信息并谋取利益。若企业欲避免成为数据泄露的下一个牺牲品,就必须始终保持警觉,预先规划,以不变应万变。为了帮助企业…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Selenium常用函数介绍

目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

CSS | transition 和 transform的用处和区别

省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...