社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python数据科学实践 | Pandas 1

狗熊会 • 4 年前 • 489 次点击  

大家好,基于Python的数据科学实践课程又到来了,大家尽情学习吧。本期内容主要由智亿同学与政委联合推出。

Q:

经过上一章的学习,大家应该已经熟悉了火锅团购数据与团购的业务。我相信大家也可以读入火锅团购数据了。那么数据科学的下一步是什么?

A:

清洗与处理数据,即把数据处理成,我们想要的样子。Python提供了一个强大的库,叫做Pandas,帮我们完成这一步骤。值得提及的是,Pandas的开发者都声称,其实是模仿R语言中的DataFrame的数据结构构建的Pandas。所以熟悉R语言的小伙伴会有似曾相识的感觉。


首先,小伙伴们可别小瞧了数据清洗,以为“数据科学”只和那些“高大上”的模型有关。实际上,在完整的数据分析的项目中,数据清洗和预处理上占的时间往往在80%左右,剩下的20%才是数据建模(毕竟好多时候都会先使用,经过大量实践证明效果好的成熟模型,往往几行代码搞定)。所以,掌握了Pandas,你的“Python数据科学之路”才算是启程了。

其次,学习Pandas可不容易,Pandas的官方文档的页数有将近2000页。初学时,学了后面忘了前面是常有的事情。为此,这一章只讲解在实际项目中最最常用的一些函数与思想,学完后,至少能完成80%的数据清洗工作。

最后,不要忘记政委是个公认的吃货,尤爱火锅烧烤。这两天可犯了愁:熊大过两天就要来西安考察工作,亟需找个高端大气上档次的饭馆!可是饭馆这么多,怎么挑个合适的!正犯愁呢,政委灵机一动:赶紧翻出上一章使用的火锅团购数据,正好可以用Pandas分析分析,找到性价比最高能够招待熊大的饭馆,打开Jupyter就开干!

初级篇—相遇Pandas

本期,我们将学会:

  • 学习如何使用Pandas读入csv、excel文件

  • 学习如何使用Pandas过滤重复值、缺失值

1、读入数据—数据分析的"米"


首先,做数据分析第一步是获取数据。俗话说,巧妇难为无米之炊。在数据分析领域,数据就是我们的“米”。获取数据的途径有两种:1. 使用爬虫从互联网上爬取数据;2. 从现有数据库中下载。本章假设火锅团购数据是现成的,所以直接读入数据即可,后续章节会讲解如何爬取现有的火锅团购数据。

表1 读入文件函数说明

例1 读入文件

1import pandas as pd # 导入Pandas模块
2raw_data=pd.read_excel("https://github.com/xiangyuchang/xiangyuchang.github.io/blob/master/BearData/shops_nm.xlsx?raw=true"#读入数据
3print('数据的维度是:', raw_data.shape) #返回值为(699,9)
4raw_data.head() #查看数据的前5行

运行结果如图1:

图1 读入文件运行结果

在这里,使用了pandas.read_excel()读入excel文件,并输出前5行观察数据。如果想打开csv文件,则需要使用pandas.read_csv()即可。

敲黑板:CSV文件的编码格式默认为UTF8,但是Office的CSV文件的编码不是UTF8,而是GBK,使用时需要注意。大家可以使用encoding参数修改编码。

Pandas常用的基本数据结构主要是两类:SeriesDataFrame

什么是DataFrame呢?所谓DataFrame,就是类似于Excel那样,如图2所示的具有行和列两个维度的特殊数据结构。肯定有人会认为这不就是矩阵吗?这里需要大家仔细去思考,真实业务场景面对的数据是如上图导入的火锅团购数据的结果一样。第一列店名是文本;第四列评分是数字。所以,这与矩阵等平时被使用的结构的区别就在于,每一列的数据类型要相同,但是不同列可以不同。基于这个理念,可以通过构建字典或数组的方式生成DataFrame。其实在上面的例子中,读入的数据就已经被自动转换成DataFrame了。

图2 DataFrame数据结构

什么是Series呢?所谓Series,简单理解,就是DataFrame中的一列(并不完全准确,但可以这么理解,见图3)。

图3 Series数据结构

2、检查重复—重复的东西咱不要

获取到的原始数据往往存在各种问题,最容易解决的是:重复值。为什么会有重复值存在?就互联网上获取到的数据而言,可能是商家付了一笔不菲的“流量费”,平台在多个位置展示同一商家的信息,这样商家有更大概率获取流量。好奇的宝宝可以进入“大众点评”、“美团”、“百度糯米”随意查看。

把数据读入后,第一步要做的是检查数据重复、缺失的情况。对于重复值,直接剔除即可;对于缺失值,可采用剔除缺失值或插值法填充数据。

表2 判断、丢弃重复值函数说明

例2 判断、丢弃重复值

1# 判断是否存在完全一致的数据行
2duplicated_data = raw_data[raw_data.duplicated() == True]
3if len(duplicated_data) == 0:
4    print('不存在完全一致的数据行')
5else:
6    print(duplicated_data)

运行结果:不存在完全一致的数据行。那么,现在制造一个完全重复的数据行。我们把数据框中的第一行赋值给第二行。

1print(raw_data.iloc[0,:])
2raw_data.iloc[1,:] = raw_data.iloc[0,:]

其显示结果为:

大家可以再次运行前一部分的代码块,它就能帮你自动发现第二个商户的信息与第一个商户完全相同。同样的方式,可以检查店名是否有重复的。显然只有第二个商户是我们赋值的重复信息,所以返回值为“老北京帅羊肉”。

1# 判断是否存在重复的店名
2duplicated_shops = raw_data['店名'][raw_data['店名'].duplicated() == True]
3if len(duplicated_shops) == 0:
4    print('不存在重复的店名')
5else:
6    print(duplicated_shops)   
7# 返回值为:老北京刷羊肉

下面终于要drop_duplicates函数出场了。

1# 等价于raw_data = raw_data[raw_data['店名'].duplicated() == False]
2drop_duplicates_shops = raw_data.drop_duplicates(subset=['店名'])
3drop_duplicates_shops.head()

其运行结果返回了去重后的商户信息列表。

综上所述,数据框中的数据去重的方法为:首先通过duplicated()方法判断是否存在重复行,再通过Pandas特有的判断表达式就可以按条件输出符合条件的数据框。注意,删除重复值可以采用drop_duplicates()方法,也可以采用“duplicated() + Pandas判断表达式”的方法,二者有相同的效果。

3、判断表达式—更Pythonic

熊大马上就要下飞机到西安了。我数据分析还没做完呢,到底带他去哪里吃饭呢。干脆来个简单粗暴的,把评分最高为5分的店都找出来,然后选吧,不犹豫了。这里就要使用Pandas特有的判断表达式,先看下面这个例子:

1for i in range(len(df1)):
2    if df1[column1].iloc[i] == value1:
3        print(df1[column1].iloc[i])

可以看到,这至少需要3行代码才能完成筛选某一列的值,非常麻烦不说,而且速度也很慢。那么,有没有办法简化操作呢?这就需要用到Pandas判断表达式了。

Pandas判断表达式本质上相当于for循环+if条件判断,但开发效率和运行效率更高。最关键的是,Pandas条件表达式也可以任性组合叠加!需要注意的是,组合叠加相当于“且”的关系,而非“或”的关系。

 1# 筛选某一列的值,返回符合条件的所有行
2df1[df1[column1] == value1]
3
4# 筛选某一列的值,返回符合条件的某一列
5df1[column2 ][df1[column1] == value1]
6
7# 筛选多列的值,返回符合条件的所有行
8df1[df1[column1] == value1][df1[column2] == value2][...]
9
10# 筛选多列的值,返回符合该条件的多列
11df1[[column1, column2]][df1[column1] == value1][...]

从上面几个例子中,Pandas的条件判断式把for循环和if判断的语句从至少3行,缩减为一行,简直是装逼神器!

最后还是来找一下带熊大吃饭的店吧。

1print(raw_data[raw_data['评分']==5])
2# 显示共有67家店铺哦,赶紧找个带熊大去。


4、检查缺失—要命的缺失


敲黑板:相比于重复值,我们更关心是否存在缺失值。


在过去,很多企业并不重视,或者说并没有意识到数据的重要性,对于数据的存储也仅仅是为了“存”,而非分析(这其实是在说,过去的大企业并不一定比现在的中小企业拥有更多的数据)。对数据的不重视导致存在大量的填写不规范,漏填、错填等,这些行为都会导致整一条数据无法使用或分析价值低。通过isnull()方法作用于某一列或某几列就可以判断是否为缺失值。

表3 判断缺失值

下面我们找一下是否有的商户的评价数是否有缺失。

例3 判断缺失值




    
1is_null_data = raw_data[raw_data['评价数'].isnull() == True]
2print(is_null_data)
3
4raw_data2 = raw_data[raw_data['评价数'].isnull() == False]

运行结果如图4所示。

图4 判断缺失值

我们发现,存在4条数据有大量的缺失值,直接通过Pandas的判断表达式剔除即可。剔除后,数据维度变为(695,9)。去除缺失值后的DataFrame命名为raw_data2(好宝宝不重复命名相同变量)。


好了,今天就先介绍到这里。

作业:载入pandas包,读入coupon_nm的文件(点击“阅读原文”下载)。利用所学过的知识检查,在团购信息的文件中是否有重复值与缺失值呢?请你自己来处理下。



往期精彩回顾
初步搭建数据科学工作环境

Conda的使用

Spyder入门

Jupyter入门

Markdown

简单读写数据

数据类型

数据结构

控制流

函数与模块

Numpy


点击这里阅读原文


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/39222
 
489 次点击