当前位置: 首页 > 后端技术 > Python

Python—关于Pandas缺失值问题(国内唯一)

时间:2023-03-26 01:15:58 Python

获取文章中的CSV文件进行代码编程,文章首地址请点击下方超链接获取CSV,编程调试请点击在本文中,我们将使用PandaslibraryforPython步骤完成许多不同的数据清理任务。具体来说,我们将专注于可能是最大的数据清理任务,即缺失值。缺失值的来源在深入研究代码之前,了解缺失数据的来源很重要。以下是数据丢失的一些典型原因:用户忘记填写字段。从旧版本的数据库手动传输时,数据会丢失。发生编程错误。用户选择不填写该字段。其中一些来源只是随机错误。在其他时候,数据丢失可能有更深层次的原因。在开始清理数据集之前,最好大致了解一下数据。有哪些功能?预期的类型是什么(int、float、string、boolean)?是否有明显的缺失数据(pandas可以检测到的值)?是否还有其他类型的缺失数据不太明显(Pandas无法轻易检测到)?为了说明我的意思,让我们开始研究一个例子。我们要处理的数据是一个非常小的房地产数据集。获取CSV文件。您可以单击此处获取它,以便对其进行编码。快速查看您的数据:快速查看数据的一个好方法是查看前几行。在Pandas中,您将编写以下代码:#Importinglibrariesimportpandasaspdimportnumpyasnp#Readcsvfileintoapandasdataframedf=pd.read_csv("propertydata.csv")#看看前几行printdf。head()Out:ST_NUMST_NAMEOWN_OCCUPIEDNUM_BEDROOMS0104.0PUTNAMY3.01197.0LEXINGTONN3.02NaNLEXINGTONN3.03201.0BERKELEYNaN1.04203.0BERKELEYY3.0我知道我说过我也会使用Pandas但我们可以看到Numpy稍后我们将使用它来重命名一些缺失值。导入库后,我们将csv文件读入Pandas数据框。使用这种方法,我们可以很容易地看到前几行。(使用.head()方法)很容易从列名中推断出以下字符组:set、get的数据类型是什么?ST_NUM:floatorint...一些数字类型ST_NAME:stringOWN_OCCUPIED:string...Y("yes")orN("no")NUM_BEDROOMS:floatorint,numbertypeStandardMissingValues什么是“标准缺失值”是什么意思?这些是Pandas可以检测到的缺失值。回到我们的原始数据集,让我们看一下“ST_NUM”列。第三列中有一个空单元格。在第七行,有一个“NA”值。显然,这些是缺失值。让我们看看Pandas是如何处理这些问题的#看ST_NUM列printdf['ST_NUM']printdf['ST_NUM'].isnull()#看ST_NUM列Out:0104.01197.02NaN3201.04203.05207.06NaN7213.08215.0Out:0False1False2True3False4False5False6True7F??alse8False查看该列,我们可以看到Pandas用“NA”填充了空白。使用这种方法,我们可以确认缺失值和“NA”都被识别为缺失值。两个布尔响应都是.isnull()和True这是一个简单的例子,但强调了一个重点。Pandas会将空单元格和“NA”类型识别为缺失值。下面,我将介绍一些Pandas无法识别的类型。非标准缺失值有时可能是缺失值格式不同的情况。让我们看看“卧室数量”一栏,看看我的意思。在此列中,有四个缺失值。n/aNA—na从上面我们知道Pandas会将“NA”识别为缺失值,那么其他情况呢?让我们来看看。#查看NUM_BEDROOMS列printdf['NUM_BEDROOMS']printdf['NUM_BEDROOMS'].isnull()Out:03132n/a31435NaN627--8naOut:0False1False2False3False4False5True6False7False8False和以前一样,Pandas认为“NA”是缺失值。不幸的是,其他类型无法识别。如果多个用户手动输入数据,这是一个常见问题。也许我喜欢用“n/a”,但别人喜欢用“na”。检测这些不同格式的一种简单方法是将它们放在一个列表中。然后,当我们导入数据时,Pandas会立即识别它们。这是我们将如何执行此操作的示例。#列出缺失值typemissing_values=["n/a","na","--"]df=pd.read_csv("propertydata.csv",na_values=missing_values)现在,让我们看看在酒吧看看会发生什么。#查看NUM_BEDROOMS列printdf['NUM_BEDROOMS']printdf['NUM_BEDROOMS'].isnull()Out:03.013.02NaN31.043.05NaN62.07NaN8NaNOut:0False1False2True3False4False5True6False7True8True我们会引入一种更复杂但常见的缺失值类型。意外缺失值到目前为止,我们已经看到了标准缺失值和非标准缺失值。如果我们得到一个意想不到的类型怎么办?例如,如果我们的特征应该是一个字符串,但具有数字类型,那么从技术上讲,这也是一个缺失值。让我们看看“OwnerOccupied**”栏,看看我在说什么。从前面的示例中,我们知道Pandas会将第7行中的空单元格检测为缺失值。让我们用一些代码来确认。#查看OWN_OCCUPIED列printdf['OWN_OCCUPIED']printdf['OWN_OCCUPIED'].isnull()#查看OWN_OCCUPIED列Out:0Y1N2N3124Y5Y6NaN7Y8YOut:0False1False2False3False4False5False6True7F??alse8Falsein第四行,数字是12。OwnerOccupied的回复显然应该是一个字符串(Y或N),所以这个数字类型应该是一个缺失值。这个例子有点复杂,所以我们需要想一个策略来检测这些类型的缺失值。有许多不同的方法,但这里是我将如何让这个方法起作用。迭代OWN_OCCUPIED列尝试将条目转换为整数如果条目可以更改为整数,则输入缺失值数据cnt=0forrowindf['OWN_OCCUPIED']:try:int(row)df.loc[cnt,'OWN_OCCUPIED']=np.nanexceptValueError:passcnt+=1在代码中,我们循环遍历每个条目的“所有者占用”列。为了尝试将条目更改为整数,我们使用.int(row)如果能把值改成整数,就可以用Numpy的把条目改成缺失值。另一方面,np.nan,如果它不能更改为整数,我们将继续。你会注意到我使用了tryandexceptValueError。这称为异常处理,我们用它来处理错误。如果我们尝试将条目更改为整数但失败了,则会返回ValueError并且代码停止。为了解决这个问题,我们使用异常处理来识别这些错误并进一步处理。代码的另一个重要部分是.loc方法。这是修改现有条目的首选Pandas方法。有关这方面的更多信息,请查看Pandas文档。现在我们已经研究了检测缺失值的不同方法,我们将在下面概述和替换它们。Summarizingmissingvalues清洗缺失值后,我们可能要总结一下。例如,我们可能想查看每个特征的缺失值总数。#每个特征打印的总缺失值df.isnull().sum()Out:ST_NUM2ST_NAME0OWN_OCCUPIED2NUM_BEDROOMS4通常我们可能需要快速检查一下是否有任何值缺失。#Anymissingvalues?printdf.isnull().values.any()Out:True我们可能还想获得缺失值的总数。#缺失值总数printdf.isnull().sum().sum()Out:8上面我们总结了缺失值的个数,下面我们看看如何做一些简单的替换。通常,您必须弄清楚如何处理缺失值。有时,您只想删除这些行,而其他时候,您会替换它们。正如我之前提到的,这不应该掉以轻心。我们将介绍一些基本的推论。#如果进行基于位置的插补,用数字df['ST_NUM'].fillna(125,inplace=True)替换缺失值。#Location-basedreplacementdf.loc[2,'ST_NUM']=125一种很常见的缺失值替换方法是使用中位数。#而是使用中位数median=df['NUM_BEDROOMS'].median()df['NUM_BEDROOMS'].fillna(median,inplace=True)