用Pandas轻松进行7项基本数据检查

news2024/11/24 8:00:20

大家好,作为一名数据工程师,面对糟糕的数据质量,可以使用Pandas执行快捷的数据质量检查。本文使用scikit-learn提供的California Housing数据集,进行基本数据检查。

一、California Housing数据集概述

【数据集】:

https://scikit-learn.org/stable/modules/generated/sklearn.datasets.fetch_california_housing.html

 本文使用Scikit-learn数据集模块中的California Housing数据集,该数据集包含20000多条记录,涵盖了八个数值特征和一个目标房价中值。

接下来,将数据集读取到一个名为df的Pandas数据帧中:

from sklearn.datasets import fetch_california_housing
import pandas as pd

# 获取California Housing数据集
data = fetch_california_housing()

# 将数据集转换为Pandas DataFrame
df = pd.DataFrame(data.data, columns=data.feature_names)

# 添加目标列
df['MedHouseVal'] = data.target

要获取数据集的详细描述,运行data.DESCR,如下所示:

print(data.DESCR)

图片

data.DESCR的输出结果

接下来了解一下数据集的基本信息:

df.info()

输出结果如下:

Output >>>


RangeIndex: 20640 entries, 0 to 20639
Data columns (total 9 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   MedInc    20640 non-null  float64
 1   HouseAge  20640 non-null  float64
 2   AveRooms  20640 non-null  float64
 3   AveBedrms 20640 non-null  float64
 4   Population   20640 non-null  float64
 5   AveOccup  20640 non-null  float64
 6   Latitude  20640 non-null  float64
 7   Longitude 20640 non-null  float64
 8   MedHouseVal  20640 non-null  float64
dtypes: float64(9)
memory usage: 1.4 MB

由于存在数值特征,因此也使用describe()方法获取摘要统计信息:

df.describe()

图片

二、7项基本数据质量检查

2.1 检查缺失值

现实世界的数据集经常存在缺失值,为了分析数据和建立模型,就需要处理这些缺失值。

为确保数据质量,应该检查缺失值的比例是否在特定的容差范围内。然后,可以使用适当的填充策略对缺失值进行填充,第一步是检查数据集中所有特征的缺失值。

以下代码会检查数据帧df中每一列的缺失值:

# 检查数据帧中的缺失值
missing_values = df.isnull().sum()
print("Missing Values:")
print(missing_values)

结果是一个显示每列缺失值计数的Pandas序列:

Output >>>

Missing Values:
MedInc      0
HouseAge    0
AveRooms    0
AveBedrms   0
Population  0
AveOccup    0
Latitude    0
Longitude   0
MedHouseVal 0
dtype: int64

如上所示,此数据集中没有缺失值。

2.2 识别重复记录

数据集中的重复记录可能会影响分析结果,应该根据需要检查并删除重复记录。以下是识别并返回df中重复行的代码,如果存在重复行,它们将包含在结果中:

# 检查数据帧中是否有重复行
duplicate_rows = df[df.duplicated()]
print("Duplicate Rows:")
print(duplicate_rows)

结果是一个空数据帧,这意味着数据集中没有重复记录:

Output >>>

Duplicate Rows:
Empty DataFrame
Columns: [MedInc, HouseAge, AveRooms, AveBedrms, Population, AveOccup, Latitude, Longitude, MedHouseVal]
Index: []

2.3 检查数据类型

在分析数据集时,经常需要转换或缩放一个或多个特征。为了避免在执行此类操作时出现意外错误,重要的是检查列是否都是预期的数据类型。

以下代码检查数据框df中每一列的数据类型:

# 检查DataFrame中每一列的数据类型
data_types = df.dtypes
print("Data Types:")
print(data_types)

在这里,所有的数值特征都是预期的浮点数据类型:

Output >>>

Data Types:
MedInc      float64
HouseAge    float64
AveRooms    float64
AveBedrms   float64
Population  float64
AveOccup    float64
Latitude    float64
Longitude   float64
MedHouseVal float64
dtype: object

2.4 检查异常值

异常值是指与数据集中其他点显著不同的数据点,在“California Housing数据集概述”部分,本文对数据帧运行了describe()方法。

根据四分位值和最大值,可以确定一些特征包含异常值。具体而言,这些特征有:

  • MedInc

  • AveRooms

  • AveBedrms

  • Population

处理异常值的一种方法是使用四分位数间距(interquartile range,IQR),即第75个四分位数和第25个四分位数之间的差值。如果Q1是第25个四分位数,Q3是第75个四分位数,那么四分位数间距的计算公式为Q3 - Q1。

然后使用四分位数和IQR来定义区间[Q1 - 1.5 * IQR, Q3 + 1.5 * IQR],所有在此范围之外的点都是异常值。

columns_to_check = ['MedInc', 'AveRooms', 'AveBedrms', 'Population']

# 查找带有异常值的记录的函数
def find_outliers_pandas(data, column):
 Q1 = data[column].quantile(0.25)
 Q3 = data[column].quantile(0.75)
 IQR = Q3 - Q1
 lower_bound = Q1 - 1.5 * IQR
 upper_bound = Q3 + 1.5 * IQR
 outliers = data[(data[column] < lower_bound) | (data[column] > upper_bound)]
 return outliers

# 对每个指定的列查找带有异常值的记录
outliers_dict = {}

for column in columns_to-check:
 outliers_dict[column] = find_outliers_pandas(df, column)

# 打印每列中带有异常值的记录
for column, outliers in outliers_dict.items():
 print(f"Outliers in '{column}':")
 print(outliers)
 print("\n")

图片

'AveRooms'列中的异常值 | 用于异常值检查的截断输出

2.5 验证数值范围

对于数值特征,一项重要的检查是验证范围。以下代码将验证MedInc值是否在预期范围内,并识别出不符合这一标准的数据点:

# 检查'MedInc'列的数值范围
valid_range = (0, 16)  
value_range_check = df[~df['MedInc'].between(*valid_range)]
print("Value Range Check (MedInc):")
print(value_range_check)

也可以尝试选择其他的数值特征,可以看到MedInc列中的所有数值都在预期范围内:

Output >>>

Value Range Check (MedInc):
Empty DataFrame
Columns: [MedInc, HouseAge, AveRooms, AveBedrms, Population, AveOccup, Latitude, Longitude, MedHouseVal]
Index: []

2.6 检查列间的依赖关系

大多数数据集都包含相关的特征,因此根据列(或特征)之间的逻辑相关关系进行检查是很重要的。虽然单个特征本身可能在预期范围内取值,但它们之间的关系可能是不一致的。

以下是本文数据集的一个示例,在一个有效的记录中,“AveRooms”通常应大于或等于“AveBedRms”。

# AveRooms不应小于AveBedrooms
invalid_data = df[df['AveRooms'] < df['AveBedrms']]
print("Invalid Records (AveRooms < AveBedrms):")
print(invalid_data)

在正在处理的California housing数据集中,没有发现这样的无效记录:

Output >>>

Invalid Records (AveRooms < AveBedrms):
Empty DataFrame
Columns: [MedInc, HouseAge, AveRooms, AveBedrms, Population, AveOccup, Latitude, Longitude, MedHouseVal]
Index: []

2.7 检查不一致的数据输入

在大多数数据集中,不一致的数据输入是一个常见的数据质量问题。例如:

  • 日期时间列中的格式不一致

  • 分类变量值的记录不一致

  • 以不同单位记录读数

在本文的数据集中,已经验证了列的数据类型并识别了异常值,但还可以尝试检查数据输入是否一致。接下来举一个简单的例子,检查所有的日期输入是否具有一致的格式。

在这里,本文使用正则表达式结合Pandas的apply()函数来检查所有日期输入是否符合YYYY-MM-DD的格式:

import pandas as pd
import re

data = {'Date': ['2023-10-29', '2023-11-15', '23-10-2023', '2023/10/29', '2023-10-30']}
df = pd.DataFrame(data)

# 定义预期的日期格式
date_format_pattern = r'^\d{4}-\d{2}-\d{2}$'  # YYYY-MM-DD format

# 检查日期值是否符合预期格式的函数
def check_date_format(date_str, date_format_pattern):
 return re.match(date_format_pattern, date_str) is not None

# 对'Date'列应用格式检查
date_format_check = df['Date'].apply(lambda x: check_date_format(x, date_format_pattern))

# 识别并检索不符合预期格式的日期记录
non_adherent_dates = df[~date_format_check]

if not non_adherent_dates.empty:
 print("Entries that do not follow the expected format:")
 print(non_adherent_dates)
else:
 print("All dates are in the expected format.")

这将返回不符合预期格式的日期记录:

Output >>>

Entries that do not follow the expected format:
      Date
2  23-10-2023
3  2023/10/29

综上,当在处理较小的数据分析项目时,使用Pandas进行这些数据质量检查是一个很好的起点。根据问题和数据集的不同,还可以加入其他检查。

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

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

相关文章

黑苹果之显卡篇

一、什么是显卡 显卡GPU&#xff08;Video card、Display card、Graphics card、Video adapter&#xff09;是个人计算机基础的组成部分之一&#xff0c;将计算机系统需要的显示信息进行转换驱动显示器&#xff0c;并向显示器提供逐行或隔行扫描信号&#xff0c;控制显示器的正…

关键字volatile作用和用法

目录 一、多线程编程中的volatile关键字 二、嵌入式编程中的volatile关键字 三、 优化编译器优化 四、 指针类型转换 一个定义为volatile的变量是说这变量可能会被意想不到地改变&#xff0c;这样&#xff0c;编译器就不会去假设这个变量的值了。 精确地说就是&#xff0c;…

【云原生-K8s】镜像漏洞安全扫描工具Trivy部署及使用

基础介绍基础描述Trivy特点 部署在线下载百度网盘下载安装 使用扫描nginx镜像扫描结果解析json格式输出 总结 基础介绍 基础描述 Trivy是一个开源的容器镜像漏洞扫描器&#xff0c;可以扫描常见的操作系统和应用程序依赖项的漏洞。它可以与Docker和Kubernetes集成&#xff0c;…

shell命令学习(1)——(待完善)

explainshell.com shell统计当前文件夹下的文件个数、目录个数Linux之shell常用命令&#xff08;三&#xff09; sort&#xff08;排序&#xff09;、uniq&#xff08;处理重复字符&#xff09; linux中shell将换行输入到文件中 shell脚本&#xff0c;将多行内容写入文件中 f…

springboot086靓车汽车销售网站

springboot086靓车汽车销售网站 成品项目已经更新&#xff01;同学们可以打开链接查看&#xff01;需要定做的及时联系我&#xff01;专业团队定做&#xff01;全程包售后&#xff01; 2000套项目视频链接&#xff1a;https://pan.baidu.com/s/1N4L3zMQ9nNm8nvEVfIR2pg?pwd…

Javascript编程进阶 – 预定义函数

Javascript编程进阶 – 预定义函数 JavaScript Programming Advanced – Predefined Functions By JacksonML JavaScript引擎中包含了一组built-in functions(内建函数)。 本文简要介绍如何通过实践使用这些预定义函数并掌握传递参数和返回值。希望对您有所帮助。 JavaScri…

如何使用HadSky搭配内网穿透工具搭建个人论坛并发布至公网随时随地可访问

文章目录 前言1. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09;2.4 公网访问测试 总结 前言 经过多年的基础…

【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)三种strlen模拟实现

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…

使用Python实现轮盘赌选择法Roulette Wheel Selection Method in Python

一、引言 最近在手写遗传算法&#xff0c;想尝试解决一些优化问题。然而&#xff0c;在编码的过程中&#xff0c;自己发现了很多都不懂的问题。比如&#xff0c;交叉的操作&#xff0c;有单点交叉、两点交叉和多点交叉&#xff0c;具体选哪一种会更好呢&#xff1f;未知。还有交…

异常检测 | 基于孤立森林(Isolation Forest)的数据异常数据检测(结合t-SNE降维可视化)

异常检测 | MATLAB实现基于孤立森林的数据异常检测 目录 异常检测 | MATLAB实现基于孤立森林的数据异常检测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现基于孤立森林(Isolation Forest)的数据异常数据检测可视化&#xff08;完整源码和数据) 基于孤立森林(…

好用免费的AI换脸5个工具

在当今社会的发展中&#xff0c;人工智能&#xff08;Artificial Intelligence, AI&#xff09;扮演着关键的角色&#xff0c;其应用领域不断扩展。作为AI的一个分支&#xff0c;换脸技术近年来备受欢迎。这项技术使得将一个人的面部特征迁移到另一个人的照片或视频成为可能。除…

【React】路由的基础使用

react-router-dom6的基础使用 1、安装依赖 npm i react-router-dom默认安装最新版本的 2、在src/router/index.js import { createBrowserRouter } from "react-router-dom"/* createBrowserRouter&#xff1a;[/home]--h5路由createHashRouter&#xff1a;[/#/ho…

各种滤波算法的比较(GF、KF、EKF、UKF、PF),内附简单实现代码

目录 一、前言 二、滤波算法介绍 1、GF&#xff08;高斯滤波&#xff09; 2、KF&#xff08;卡尔曼滤波&#xff09; 3、EKF&#xff08;可扩展卡尔曼滤波&#xff09; 4、UKF&#xff08;无迹卡尔曼滤波&#xff09; 5、PF&#xff08;粒子滤波&#xff09; 三、不同滤…

zabbix配置snmp trap--使用snmptrapd和Bash接收器--图文教程

1.前言 我的zabbix的版本是5.0版本&#xff0c;5.0的官方文档没有使用bash接收器的示例&#xff0c;6.0的官方文档有使用bash接收器的示例&#xff0c;但是&#xff0c;下载文件的链接失效&#xff1f;&#xff01; 这里讲解zabbix-server端配置和zabbix web端配置 2.zabbix-…

Day04 Liunx高级系统设计4-信号

进程间通讯 引入 如何将 A 进程中的数据传入 B 进程呢 ? 我们要使用进程间通讯 概述 中文名 : 进程间通讯 英文名 :IPC 英文全称 :Inter Processes Communication 作用: 数据传输&#xff1a;一个进程需要将他的数据发送给另一个进程】 资源共享&#xff1a;多个进程可以…

排序:直接选择排序

直接选择排序&#xff1a; 本质&#xff1a; 直接选择排序的本质就是在数组中进行遍历挑选出最大的元素&#xff0c;讲最大的元素放到对应的位置后&#xff0c;再次选出次大的位置&#xff0c;而后又放到对应的位置..........................直到数组成为一个有序序列。 优…

二叉树的层平均值[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[3.00000,14.50000,1…

解决:AttributeError: module ‘copy’ has no attribute ‘copy’

解决&#xff1a;AttributeError: module ‘copy’ has no attribute ‘copy’ 文章目录 解决&#xff1a;AttributeError: module copy has no attribute copy背景报错问题报错翻译报错位置代码报错原因解决方法方法一方法二方法三今天的分享就到此结束了 背景 在使用之前的代…

C语言指针详解上

1 野指针 int main01(){//野指针就是没有初始化的指针,指针的指向是随机的,不可以 操作野指针//int a 0;//指针p保存的地址一定是定义过的(向系统申请过的)int *p;//野指针*p 200;printf("%d\n",*p);system("pause");return 0;}2 空指针 空指针的作用…

Unity 关于Ray、RaycastHit、Raycast及其使用

Unity中&#xff0c;我们要进行物理模拟和碰撞检测时&#xff0c;有三个重要的概念Ray、RaycastHit、Raycast。 其中&#xff0c;Ray可以理解为射线&#xff0c;它是一条从起点沿着特定方向延伸的无限长线段。 它的语法是&#xff1a; Ray(Vector3 origin, Vector3 directio…