严把数据质量关,用Pandas轻松进行7项基本数据检查

学习如何使用Pandas执行数据质量检查,从检测缺失记录到离群值、不一致的数据输入等等。

微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩

图片

一、简介

图片

作为一名数据工程师,面对糟糕的数据质量,该如何进行必要的数据质量检查呢?可以使用Pandas执行快捷的数据质量检查。

本文使用scikit-learn提供的California Housing数据集。

【数据集】:https://scikit-learn.org/stable/modules/generated/sklearn.datasets.fetch_california_housing.html

二、California Housing数据集概述

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

【数据集模块】:https://scikit-learn.org/stable/datasets/real_world.html#real-world-datasets

接下来,将数据集读取到一个名为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()

图片

df.describe()的输出结果

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

3.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

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

3.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: []

3.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

3.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'列中的异常值 | 用于异常值检查的截断输出

3.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: []

3.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: []

3.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进行常见数据质量检查的方法。

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

推荐书单

《Pandas数据分析》

《Pandas数据分析》详细阐述了与Pandas数据分析相关的基本解决方案,主要包括数据分析导论、使用PandasDataFrame、使用Pandas进行数据整理、聚合Pandas DataFrame、使用Pandas和Matplotlib可视化数据、使用Seabom和自定义技术绘图、金融分析、基于规则的异常检测、Python机器学习入门、做出更好的预测、机器学习异常检测等内容。此外,该书还提供了相应的示例、代码,以帮助读者进一步理解相关方案的实现过程。

《Pandas数据分析》适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学用书和参考手册。

《Pandas数据分析》icon-default.png?t=N7T8https://item.jd.com/14065178.html

精彩回顾

《Pandas进阶指南,掌握这10个基本函数搞定数据处理(下)》

《Pandas进阶指南,掌握这10个基本函数搞定数据处理(上)》

《15个必知Pandas代码片段,助你精通数据分析》

《轻松玩转Python,5个步骤打造惊艳的折线图》

《10个Python中的数据类型技巧》

《Python的集合模块,使用数据容器处理数据集合》

微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩

访问【IT今日热榜】,发现每日技术热点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值