[数据清洗]-Pandas 清洗“脏”数据(一)

概要
  • 准备工做
  • 检查数据
  • 处理缺失数据
  • 添加默认值
  • 删除不完整的行
  • 删除不完整的列
  • 规范化数据类型
  • 必要的转换
  • 重命名列名
  • 保存结果
  • 更多资源

Pandas 是 Python 中很流行的类库,使用它能够进行数据科学计算和数据分。他能够联合其余数据科学计算工具一起使用,好比,SciPy,NumPy 和 Matplotlib,建模工程师能够经过建立端到端的分析工做流来解决业务问题。html

虽然咱们能够 Python 和数据分析作不少强大的事情,可是咱们的分析结果的好坏依赖于数据的好坏。不少数据集存在数据缺失,或数据格式不统一(畸形数据),或错误数据的状况。不论是不完善的报表,仍是技术处理数据的失当都会不可避免的引发“脏”数据。git

庆幸的是,Pandas 提供功能强大的类库,无论数据处于什么状态,他能够帮助咱们经过清洗数据,排序数据,最后获得清晰明了的数据。对于案例的数据,准备使用 movie_metadata.csv(连接:https://pan.baidu.com/s/1i5zUvOD 密码:a4t9)。这个数据集包含了不少信息,演员、导演、预算、总输入,以及 IMDB 评分和上映时间。实际上,可使用上百万或者更大的数据库,可是,案例数据集对于开始入门仍是很好的。github

不幸的是,有一些列的值是缺失的,有些列的默认值是0,有的是 NaN(Not a Number)。数据库

下面咱们经过使用 Pandas 提供的功能来清洗“脏”数据。工具

准备工做

首先,第一次使用 Pandas 以前,咱们须要安装 Pandas。安装命令以下:spa

pip install pandas

 

接下来,导入 Pandas 到咱们的代码中,代码以下:code

#可使用其余的别名, 可是,pd 是官方推荐的别名,也是你们习惯的别名
import pandas as pd

 

最后,加载数据集,代码以下:htm

data = pd.read_csv('../data/tmdb_5000_credits.csv')

 

注意,确保已经下载数据集,若是你的代码和数据集的存放结构与个人同样,直接运行就能够blog

不然,要根据实际的状况,修改 read_csv() 的文件路径排序

 

检查数据

检查一下咱们刚刚读入数据的基本结构,Pandas 提供了 head() 方法打印输出前五行数据。目的是让咱们对读入的数据有一个大体的了解。

data.head()

咱们能够经过上面介绍的 Pandas 的方法查看数据,也能够经过传统的 Excel 程序查看数据,这个时候,咱们能够开始记录数据上的问题,而后,咱们再想办法解决问题。

Pandas 提供了一些选择的方法,这些选择的方法能够把数据切片,也能够把数据切块。下面咱们简单介绍一下:

  • 查看一列的一些基本统计信息:data.columnname.describe()
  • 选择一列:data['columnname']
  • 选择一列的前几行数据:data['columnsname'][:n]
  • 选择多列:data[['column1','column2']]
  • Where 条件过滤:data[data['columnname'] > condition]


处理缺失数据

缺失数据是最多见的问题之一。产生这个问题可能的缘由

  • 历来没有填正确过
  • 数据不可用
  • 计算错误

不管什么缘由,只要有空白值得存在,就会引发后续的数据分析的错误。下面介绍几个处理缺失数据的方法:

  • 为缺失数据赋值默认值
  • 去掉/删除缺失数据行
  • 去掉/删除缺失率高的列

添加默认值

咱们应该去掉那些不友好的 NaN 值。可是,咱们应该用什么值替换呢?在这里,咱们就应该稍微掌握一下数据。对于咱们的例子,咱们检查一下“country”列。这一列很是简单,然而有一些电影没有提供地区,因此有些数据的值是 NaN。在咱们的案例中,咱们推断地区并非很重要,因此,咱们但是使用“”空字符串或其余默认值。

data.country= data.country.fillna('')

 

上面,咱们就将“country”整个列使用“”空字符串替换了,或者,咱们也能够轻易地使用“None Given”这样的默认值进行替换。若是想了解更多 fillna() 的详细信息参考 pandas.DataFrame.fillna


使用数字类型的数据,好比,电影的时长,计算像电影平均时长能够帮咱们甚至是数据集。这并非最优解,但这个持续时间是根据其余数据估算出来的。这样的方式下,就不会由于像 0 或者 NaN这样的值在咱们分析的时候而抛错。

data.duration = data.duration.fillna(data.duration.mean())

 

删除不完整的行

假设咱们想删除任何有缺失值得行。这种操做太据侵略性,可是咱们能够根据咱们的须要进行扩展。

删除任何包含 NA 值的行是很容的:

data.dropna()

 

固然,咱们也能够删除一整行的值都为 NA:

data.dropna(how='all')

 

咱们也能够增长一些限制,在一行中有多少非空值的数据是能够保留下来的(在下面的例子中,行数据中至少要有 5 个非空值)

data.drop(thresh=5)

 

好比说,咱们不想要不知道电影上映时间的数据:

data.dropna(subset=['title_year'])

 

上面的 subset 参数容许咱们选择想要检查的列。若是是多个列,可使用列名的 list 做为参数。


删除不完整的列

咱们能够上面的操做应用到列上。咱们仅仅须要在代码上使用 axis=1 参数。这个意思就是操做列而不是行。(咱们已经在行的例子中使用了 axis=0,由于若是咱们不传参数 axis,默认是axis=0。)

删除一正列为 NA 的列:

data.drop(axis=1, how='all')

删除任何包含空值的列:

data.drop(axis=1. how='any')

这里也可使用像上面同样的 threshold 和 subset,更多的详情和案例,请参考pandas.DataFrame.dropna


规范化数据类型

有的时候,尤为当咱们读取 csv 中一串数字的时候,有的时候数值类型的数字被读成字符串的数字,或将字符串的数字读成数据值类型的数字。Pandas 仍是提供了规范化咱们数据类型的方式:

data = pd.read_csv('../data/moive_metadata.csv', dtype={'duration': int})

这就是告诉 Pandas ‘duration’列的类型是数值类型。一样的,若是想把上映年读成字符串而不是数值类型,咱们使用和上面相似的方法:

data = pd.read_csv('./data/moive_metadata.csv', dtype={'title_year':str})

注意,须要记住的是,再次从磁盘上读取 csv ,确保规范化了咱们的数据类型,或者在读取以前已经保存了中间结果。

 

必要的变换

人工录入的数据可能都须要进行一些必要的变换。

  • 错别字
  • 英文单词时大小写的不统一
  • 输入了额外的空格

将咱们数据中全部的 movie_title 改为大写:

data['movie_title'].str.upper()

一样的,干掉末尾空格:

data['movie_title'].str.strip()

这里并无介绍关于英文的拼写错误的问题,能够参考模糊匹配

 

重命名列名

最终的数据多是有计算机生成的,那么,列名有可能也是计算机按照必定计算规律生成的。这些列名对计算机没有什么,可是对于人来讲可能就不够友好,这时候,咱们就须要重命名成对人友好的列名,代码以下:

data,rename(columns = {‘title_year’:’release_date’, ‘movie_facebook_likes’:’facebook_likes’})

像上面这样,咱们就完成了两个列的重命名。须要注意的是,这个方法并无提供 inpalce 参数,咱们须要将结果赋值给本身才能够:

data = data.rename(columns = {‘title_year’:’release_date’, ‘movie_facebook_likes’:’facebook_likes’})


保存结果

咱们完成数据清洗以后,通常会把结果再以 csv 的格式保存下来,以便后续其余程序的处理。一样,Pandas 提供了很是易用的方法:

data.to_csv(‘cleanfile.csv’ encoding=’utf-8’)


更多资源

此次介绍仅仅是冰山一角。有不少方式可能形成数据集变“脏”或被破坏:

  • 用户环境的不一样、
  • 所使用语言的差别
  • 用户输入的差异

在这里,我介绍了 Python 用 Pandas 清洗数据最通常的方式。

更多关于数据清洗的内容能够关注知乎上的专栏“数据清洗

 知乎数据清洗- Pandas 清洗“脏”数据(一)