检测这些各种格式的一种简单方法是将它们放在列表中。然后,当我们导入数据时,Pandas会立即识别出它们。这是我们将如何执行此操作的示例。
# 列出缺失的值类型 missing_values = ["n/a", "na", "--"] df = pd.read_csv("property data.csv", na_values = missing_values)现在,让我们再看一下该栏,看看会发生什么。
# 看NUM_BEDROOMS这一栏 print df['NUM_BEDROOMS'] print df['NUM_BEDROOMS'].isnull() Out: 0 3.0 1 3.0 2 NaN 3 1.0 4 3.0 5 NaN 6 2.0 7 NaN 8 NaN Out: 0 False 1 False 2 True 3 False 4 False 5 True 6 False 7 True 8 True下面中,我们将介绍一种更复杂但很常见的缺失值类型。
意外的缺失值到目前为止,我们已经看到了标准缺失值和非标准缺失值。如果我们出现意外类型怎么办?
例如,如果我们的功能应该是字符串,但是有数字类型,那么从技术上讲,这也是一个缺失值。
让我们看一下“Owner Occupied**”一栏,看看我在说什么。
从前面的示例中,我们知道Pandas将检测到第7行中的空单元格为缺失值。让我们用一些代码进行确认。
# 查看OWN_OCCUPIED列 print df['OWN_OCCUPIED'] print df['OWN_OCCUPIED'].isnull() # 查看OWN_OCCUPIED列 Out: 0 Y 1 N 2 N 3 12 4 Y 5 Y 6 NaN 7 Y 8 Y Out: 0 False 1 False 2 False 3 False 4 False 5 False 6 True 7 False 8 False在第四行中,数字为12。Owner Occupied的响应显然应该是字符串(Y或N),因此此数字类型应为缺失值。
这个示例稍微复杂一点,因此我们需要考虑一种策略来检测这些类型的缺失值。有很多不同的方法,但是这是我要通过这种方法工作的方式。
遍历OWN_OCCUPIED列
尝试将条目转换为整数
如果条目可以更改为整数,请输入缺失值
如果数字不能是整数,我们知道它是一个字符串,所以继续
看一下代码,然后我将对其进行详细介绍
# 检测数据 cnt=0 for row in df['OWN_OCCUPIED']: try: int(row) df.loc[cnt, 'OWN_OCCUPIED']=np.nan except ValueError: pass cnt+=1在代码中,我们循环浏览“所有者已占用”列中的每个条目。要尝试将条目更改为整数,我们使用。int(row)
如果可以将值更改为整数,则可以使用Numpy's将条目更改为缺少的值。np.nan
另一方面,如果不能将其更改为整数,我们pass将继续。
您会注意到我使用try和except ValueError。这称为异常处理,我们使用它来处理错误。
如果我们尝试将一个条目更改为一个整数并且无法更改,则将ValueError返回a,并且代码将停止。为了解决这个问题,我们使用异常处理来识别这些错误,并继续进行下去。
代码的另一个重要部分是.loc方法。这是用于修改现有条目的首选Pandas方法。有关此的更多信息,请查看Pandas文档。
现在,我们已经研究了检测缺失值的不同方法,下面将概述和替换它们。
总结缺失值清除缺失的值后,我们可能要对它们进行汇总。例如,我们可能要查看每个功能的缺失值总数。
# Total missing values for each feature print df.isnull().sum() Out: ST_NUM 2 ST_NAME 0 OWN_OCCUPIED 2 NUM_BEDROOMS 4在更多的时候,我们可能需要进行快速检查,以查看是否根本缺少任何值。
# Any missing values? print df.isnull().values.any() Out: True我们可能还希望获得缺失值的总数。
# Total number of missing values print df.isnull().sum().sum() Out: 8在上面,我们总结了缺失值的数量,让我们看一下如何进行一些简单的替换。
更换通常,您必须弄清楚如何处理缺失值。
有时,您只是想删除这些行,而其他时候,您将替换它们。
正如我之前提到的,这不应该掉以轻心。我们将介绍一些基本的推论。
# 用一个数字替换缺失的值 df['ST_NUM'].fillna(125, inplace=True)如果进行基于位置的插补。
# 基于位置的更换 df.loc[2,'ST_NUM'] = 125替换缺失值的一种非常常见的方法是使用中位数。
# 取代使用中位数 median = df['NUM_BEDROOMS'].median() df['NUM_BEDROOMS'].fillna(median, inplace=True)