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

Pandas 是 Python 中很流行的类库,使用它可以进行数据科学计算和数据分。他可以联合其他数据科学计算工具一块儿使用,比如,SciPy,NumPy 和 Matplotlib,建模工程师可以通过创建端到端的分析工作流来解决业务问题。

虽然我们可以 Python 和数据分析做很多强大的事情,但是我们的分析结果的好坏依赖于数据的好坏。很多数据集存在数据缺失,或数据格式不统一(畸形数据),或错误数据的情况。不管是不完善的报表,还是技术处理数据的失当都会不可避免的引起“脏”数据。

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

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

下面我们通过使用 Pandas 提供的功能来清洗“脏”数据。

准备工作

首先,第一次使用 Pandas 之前,我们需要安装 Pandas。安装命令如下:

pip install pandas

接下来,导入 Pandas 到我们的代码中,代码如下:

#可以使用其他的别名, 但是,pd 是官方推荐的别名,也是大家习惯的别名
import pandas as pd

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

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

注意,确保已经下载数据集,如果你的代码和数据集的存放结构与我的一样,直接运行就可以

否则,要根据实际的情况,修改 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 清洗“脏”数据(一)

[数据清洗]-Pandas 清洗“脏”数据(一)的更多相关文章

  1. [数据清洗]- Pandas 清洗“脏”数据(二)

    概要 了解数据 分析数据问题 清洗数据 整合代码 了解数据 在处理任何数据之前,我们的第一任务是理解数据以及数据是干什么用的.我们尝试去理解数据的列/行.记录.数据格式.语义错误.缺失的条目以及错误的 ...

  2. [数据清洗]- Pandas 清洗“脏”数据(三)

    预览数据 这次我们使用 Artworks.csv ,我们选取 100 行数据来完成本次内容.具体步骤: 导入 Pandas 读取 csv 数据到 DataFrame(要确保数据已经下载到指定路径) D ...

  3. [数据清洗]-使用 Pandas 清洗“脏”数据

    概要 准备工作 检查数据 处理缺失数据 添加默认值 删除不完整的行 删除不完整的列 规范化数据类型 必要的转换 重命名列名 保存结果 更多资源 Pandas 是 Python 中很流行的类库,使用它可 ...

  4. Linux 根目录所在分区被脏数据占满

    背景: ​ 公司在做一个项目,大概功能就是一个通行闸机的人脸识别系统,要经过门禁的人注册了之后,系统就会存储一张原始的图片在服务器的数据文件夹里面,包括了永久的存储和一些访客注册临时存储.一天周五的时 ...

  5. HIbernate的脏数据检测和延缓加载

    脏数据监测: 在一个事务中,加载的数据,除了返回给用户之外,会复制一份在session中,在事务提交时,会用session中的备份和用户的数据进行比对,如果用户的数据状态改变, 则用户的数据即为:脏数 ...

  6. 如何使用R语言解决可恶的脏数据

    转自:http://shujuren.org/article/45.html 在数据分析过程中最头疼的应该是如何应付脏数据,脏数据的存在将会对后期的建模.挖掘等工作造成严重的错误,所以必须谨慎的处理那 ...

  7. Oracle添加含有脏数据的约束

    需求: 一个表的唯一约束被禁用期间,有脏数据进来,当启用约束时失败. 环境: -bash-4.1$ uname -a Linux dbtest1 2.6.32-279.el6.x86_64 #1 SM ...

  8. Python利用pandas处理Excel数据的应用

    Python利用pandas处理Excel数据的应用   最近迷上了高效处理数据的pandas,其实这个是用来做数据分析的,如果你是做大数据分析和测试的,那么这个是非常的有用的!!但是其实我们平时在做 ...

  9. [NewLife.XCode]脏数据

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示 ...

随机推荐

  1. python大法好——继承、多态

    1.继承 类的继承 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制. 通过继承创建的新类称为子类或派生类,被继承的类称为基类.父类或超类. 继承语法 class 派 ...

  2. Java笔记一JAVA安装环境变量配置

    window系统安装Java 下载Java开发工具包JDK,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.htm ...

  3. django-内网项目上线测试部署步骤

    1.安装python环境 由于测试环境只有内网,所以在外网同系统上安装python. wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5 ...

  4. MySQL的or/in/union与索引优化

    转载自:MySQL的or/in/union与索引优化 https://blog.csdn.net/zhangweiwei2020/article/details/80005590 假设订单业务表结构为 ...

  5. 关于six.with_metaclass(ABCMeta, object)的理解

    在学习Python过程中,看到了生成虚基类的方式, class PeopleBase(six.with_metaclass(ABCMeta, object)): @abstractmethod def ...

  6. js:作用域总结1

    先说几个概念: 1.js代码从上往下执行 2.变量提升: 变量提升是浏览器的一个功能,在运行js代码之前,浏览器会给js一个全局作用域叫window,window分两个模块,一个叫内存模块,一个叫运行 ...

  7. Spring中@相关注解的意义

    1.@controller 控制器(注入服务) 用于标注控制层,相当于struts中的action层 2.@service 服务(注入dao) 用于标注服务层,主要用来进行业务的逻辑处理 3.@rep ...

  8. week0713.5 newspaper 安装问题

    然后爆红说nltk==2.0.5 太老了 所以我们 把包下载下来将requirements文件中nltk==2.0.5改成3.3.0 然后 将包打包 然后安装这个包就OK 下载newpaper wge ...

  9. API接口认证

    restful API接口可以很方便的让其他系统调用,为了让指定的用户/系统可以调用开放的接口,一般需要对接口做认证; 接口认证有两种方式: 1.认证的token当做post/get的参数,serve ...

  10. pymysql 读取数据库没有字段

    import pymysql # 打开数据库连接db = pymysql.connect("localhost", "root", "root&quo ...