使用Pandas进行的7个必要的数据质量检查

改进后的标题: Pandas 数据质量检查的 7 个必备步骤

 

作为数据专业人士,你可能对数据质量的成本很熟悉。无论数据项目的规模大小,你都应该进行基本的数据质量检查。

有专门用于数据质量评估的库和框架。但如果你是初学者,你可以使用pandas运行简单但重要的数据质量检查。这篇教程将教你如何做到这一点。

我们将使用scikit-learn中的加州住房数据集进行本教程。

 

加州住房数据集概述

 

我们将使用Scikit-learn的datasets模块中的加州住房数据集。该数据集包含超过20000条记录,包含八个数值特征和一个目标中位数房价。

让我们将数据集读取到一个pandas dataframe中,命名为df

from sklearn.datasets import fetch_california_housing
import pandas as pd
# 获取加州住房数据集
data = fetch_california_housing()
# 将数据集转换为pandas DataFrame
df = pd.DataFrame(data.data, columns=data.feature_names)
# 添加目标列
df['MedHouseVal'] = data.target

 

要获取数据集的详细描述,请运行data.DESCR代码:

print(data.DESCR)

 

 

让我们获取数据集的一些基本信息:

df.info()

 

以下是输出结果:

Output >>>RangeIndex: 20640 entries, 0 to 20639Data 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  float64dtypes: float64(9)memory usage: 1.4 MB

 

因为我们有数值特征,所以让我们使用describe()方法获取概要统计信息:

df.describe()

 

 

1. 检查缺失值

 

现实世界的数据集经常会出现缺失值。为了分析数据和构建模型,你需要处理这些缺失值。

为了确保数据质量,你应该检查数据集中每个特征的缺失值比例是否在特定的容忍限制范围内。然后可以使用适当的填补策略补充缺失值。

因此,首先要检查数据框df中每列的缺失值。

下面的代码检查数据框df中每列的缺失值:

# Check for missing values in the DataFrame
missing_values = df.isnull().sum()
print("缺失值:")
print(missing_values)

 

结果是一个pandas系列,显示每列的缺失值数量:

输出 >>>缺失值:MedInc         0HouseAge       0AveRooms       0AveBedrms      0Population     0AveOccup       0Latitude       0Longitude      0MedHouseVal    0dtype: int64

 

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

 

2.识别重复记录

 

数据集中的重复记录可能会扭曲分析结果。因此,您应该根据需要检查并删除重复记录。

以下代码用于识别和返回df中的重复行。如果存在任何重复行,则将包含在结果中:

# 检查数据集中的重复行duplicate_rows = df[df.duplicated()]print("重复行:")print(duplicate_rows)

 

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

输出 >>>重复行:Empty DataFrameColumns: [MedInc, HouseAge, AveRooms, AveBedrms, Population, AveOccup, Latitude, Longitude, MedHouseVal]Index: []

 

3.检查数据类型

 

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

此代码检查数据框df中每列的数据类型:

# 检查数据框中每列的数据类型data_types = df.dtypesprint("数据类型:")print(data_types)

 

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

输出 >>>数据类型:MedInc        float64HouseAge     float64AveRooms     float64AveBedrms    float64Population   float64AveOccup     float64Latitude     float64Longitude    float64MedHouseVal  float64dtype: object

 

4.检查异常值

 

异常值是与数据集中其他点明显不同的数据点。如果您记得,我们在数据框上运行了describe()方法。

基于四分位值和最大值,您可以确定一些特征子集中包含异常值。具体来说,这些特征包括:

  • MedInc
  • AveRooms
  • AveBedrms
  • Population

处理异常值的一种方法是使用四分位数范围,即第75个和第25个四分位数之间的差值。如果Q1是第25个四分位数,Q3是第75个四分位数,则四分位数范围由以下公式给出:Q3 – Q1。

然后,我们使用四分位数和四分位数范围定义区间[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"'{column}'中的异常值:")   print(outliers) print("\n")

 

 

5. 验证数字范围

 

对于数字特征来说,验证范围是一个重要的检查。这可以确保特征的所有观察值都在预期范围内。

以下代码验证了’MedInc’值是否在预期范围内,并识别出不符合该条件的数据点:

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

 

您可以尝试其他数值特征。但是我们看到’MedInc’列中的所有值都在预期范围内:

输出 >>>数值范围检查 (MedInc):空的DataFrame列: [MedInc, HouseAge, AveRooms, AveBedrms, Population, AveOccup, Latitude, Longitude, MedHouseVal]索引: []

 

6. 检查跨列依赖

 

大多数数据集都包含相关的特征。因此,基于列(或特征)之间的逻辑相关关系进行检查是很重要的。

虽然特征个体可能落在预期范围内的值,但它们之间的关系可能不一致。

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

# AveRooms不能小于AveBedrooms的无效数据invalid_data = df[df['AveRooms'] < df['AveBedrms']]print("无效记录 (AveRooms < AveBedrms):")print(invalid_data)

 

在我们正在处理的加利福尼亚州住房数据集中,我们看到没有这样的无效记录:

输出 >>>无效记录 (AveRooms < AveBedrms):空的DataFrame列: [MedInc, HouseAge, AveRooms, AveBedrms, Population, AveOccup, Latitude, Longitude, MedHouseVal]索引: []

 

7. 检查不一致的数据输入

 

不一致的数据输入是大多数数据集中常见的数据质量问题。例子包括:

  • 日期时间列中的不一致格式化 
  • 分类变量值的记录不一致 
  • 以不同单位记录读数 

在我们的数据集中,我们已经验证了列的数据类型并识别了异常值。但是您也可以运行检查不一致数据输入。

让我们用一个简单的例子来检查所有日期条目是否具有一致的格式。

在这里,我们使用正则表达式与pandas的apply()函数结合使用,以检查所有日期条目是否为YYYY-MM-DD格式:

import pandas as pdimport redata = {'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 格式# 函数检查日期值是否与预期的格式匹配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("不符合预期格式的条目:")    print(non_adherent_dates)else:  print("所有日期都符合预期格式。")

 

这将返回不符合预期格式的条目:

输出 >>> 不符合预期格式的条目:        Date2  23-10-20233  2023/10/29

 

总结

 

在本教程中,我们介绍了使用pandas进行常见数据质量检查的方法。

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

如果您有兴趣学习数据分析,请查看指南《通过Pandas和Python掌握数据整理的7个步骤》

[Bala Priya C](https://twitter.com/balawc27) 是一位来自印度的开发人员和技术作家。她喜欢在数学、编程、数据科学和内容创作的交叉领域工作。她的兴趣和专长领域包括DevOps、数据科学和自然语言处理。她喜欢阅读、写作、编码和咖啡!目前,她正在学习并通过撰写教程、指南、观点文章等向开发者社区分享她的知识。