Python数据分析从入门到精通
上QQ阅读APP看书,第一时间看更新

3.4 导入外部数据

数据分析首先就要有数据。那么,数据类型有多种,本节介绍如何导入不同类型的外部数据。

3.4.1 导入.xls或.xlsx文件

导入.xls或.xlsx文件主要使用Pandas的read_excel()方法,语法如下:

pandas.read_excel(io,sheet_name=0,header=0,names=None,index_col=None,usecols=None,squeeze=False,
dtype=None,engine=None,converters=None,true_values=None,false_values=None,skiprows=None,nrow=None,
na_values=None,keep_default_na=True,verbose=False,parse_dates=False,date_parser=None,thousands=None,
comment=None,skipfooter=0,conver_float=True,mangle_dupe_cols=True,**kwds)

常用参数说明:

 io:字符串,.xls或.xlsx文件路径或类文件对象。

 sheet_name:None、字符串、整数、字符串列表或整数列表,默认值为0。字符串用于工作表名称,整数为索引表示工作表位置,字符串列表或整数列表用于请求多个工作表,为None时获取所有工作表。参数值如表3.4所示。

表3.4 sheet_name参数值

 header:指定作为列名的行,默认值为0,即取第一行的值为列名。数据为除列名以外的数据;若数据不包含列名,则设置header=None。

 names:默认值为None,要使用的列名列表。

 index_col:指定列为索引列,默认值为None,索引0是DataFrame的行标签。

 usecols:int、list列表或字符串,默认值为None。

 如果为None,则解析所有列。

 如果为int,则解析最后一列。

 如果为list列表,则解析列号列表的列。

 如果为字符串,则表示以逗号分隔的Excel列字母和列范围列表(例如“A:E”或“A,C,E:F”)。范围包括双方。

 squeeze:布尔值,默认值为False,如果解析的数据只包含一列,则返回一个Series。

 dtype:列的数据类型名称或字典,默认值为None。例如{'a':np.float64,'b':np.int32}。

 skiprows:省略指定行数的数据,从第一行开始。

 skipfooter:省略指定行数的数据,从尾部数的行开始。

下面通过示例,详细介绍如何导入.xlsx文件。

1.常规导入

【示例12】 导入Excel文件。(示例位置:资源包\MR\Code\03\12)

导入“1月.xlsx”Excel文件,程序代码如下:

01 import pandas as pd
02 df=pd.read_excel('1 月.xlsx')
03 df1=df.head()          #输出前5 条数据

运行程序,输出前5条数据,结果如图3.13所示。

图3.13 1月淘宝销售数据(前5条数据)

知识胶囊

导入外部数据,必然要涉及路径问题,下面来了解一下相对路径和绝对路径。

 相对路径:相对路径就是以当前文件为基准进行一级级目录指向被引用的资源文件。以下是常用的表示当前目录和当前目录的父级目录的标识符。

 ../:表示当前文件所在目录的上一级目录。

 ./:表示当前文件所在的目录(可以省略)。

 /:表示当前文件的根目录(域名映射或硬盘目录)。

 如果使用系统默认文件路径\,那么,在Python中则需要在路径最前面加一个r,以避免路径里面的\被转义。

 绝对路径:绝对路径是文件真正存在的路径,是指从硬盘的根目录(盘符)开始,进行一级级目录指向文件。

2.导入指定的Sheet页

一个Excel文件包含多个Sheet页,通过设置sheet_name参数就可以导入指定Sheet页的数据。

【示例13】 导入指定Sheet页的数据。(示例位置:资源包\MR\Code\03\13)

一个Excel文件包含多家店铺的销售数据,导入其中一家店铺(莫寒)的销售数据,如图3.14所示。

图3.14 原始数据

程序代码如下:

01 import pandas as pd
02 df=pd.read_excel('1 月.xlsx',sheet_name='莫寒')
03 df1=df.head()          #输出前5条数据

运行程序,输出前5条数据,结果如图3.15所示。

除了指定Sheet页的名字,还可以指定Sheet页的顺序,从0开始。例如,sheet_name=0表示导入第一个Sheet页的数据,sheet_name=1表示导入第二个Sheet页的数据,以此类推。

如果不指定sheet_name参数,则默认导入第一个Sheet页的数据。

3.通过行、列索引导入指定行、列数据

DataFrame是二维数据结构,因此它既有行索引又有列索引。当导入Excel数据时,行索引会自动生成,如0、1、2;而列索引则默认将第0行作为列索引(如A,B,…,J)。DataFrame行、列索引的示意图如图3.16所示。

图3.15 导入指定的Sheet页(前5条数据)

图3.16 DataFrame行、列索引示意图

【示例14】 指定行索引导入Excel数据。(示例位置:资源包\MR\Code\03\14)

如果通过指定行索引导入Excel数据,则需要设置index_col参数。下面将“买家会员名”作为行索引(位于第0列),导入Excel数据,程序代码如下:

01 import pandas as pd
02 df1=pd.read_excel('1 月.xlsx',index_col=0)     #“买家会员名”为行索引
03 df1=df1.head()                                 #输出前5条数据

运行程序,输出结果如图3.17所示。

图3.17 通过指定行索引导入Excel数据

如果通过指定列索引导入Excel数据,则需要设置header参数,主要代码如下:

df2=pd.read_excel('1.xlsx',header=1)        #设置第1行为列索引

运行程序,输出结果如图3.18所示。

如果将数字作为列索引,可以设置header参数为None,主要代码如下:

df3=pd.read_excel('1.xlsx',header=None)    #列索引为数字

运行程序,输出结果如图3.19所示。

图3.18 通过指定列索引导入Excel数据

图3.19 指定列索引

那么,为什么要指定索引呢?因为通过索引可以快速地检索数据,例如df3[0],就可以快速检索到“买家会员名”这一列数据。

4.导入指定列数据

一个Excel往往包含多列数据,如果只需要其中的几列,可以通过usecols参数指定需要的列,从0开始(表示第1列,以此类推)。

【示例15】 导入第1列数据。(示例位置:资源包\MR\Code\03\15)

下面导入第1列数据(索引为0),程序代码如下:

01 import pandas as pd
02 df1=pd.read_excel('1 月.xlsx',usecols=[0])       #导入第1列
03 df1.head()

运行程序,输出结果如图3.20所示。

如果导入多列,可以在列表中指定多个值。例如,导入第1列和第4列,主要代码如下:

df2=pd.read_excel('1.xlsx',usecols=[0,3])

也可以指定列名称,主要代码如下:

df3=pd.read_excel('1.xlsx',usecols=['买家会员名','宝贝标题'])

运行程序,输出结果如图3.21所示。

图3.20 导入第1列

图3.21 导入第1列和第4列数据

3.4.2 导入.csv文件

导入.csv文件主要使用Pandas的read_csv()方法,语法如下:

常用参数说明:

 filepath_or_buffer:字符串,文件路径,也可以是URL链接。

 sep、delimiter:字符串,分隔符。

 header:指定作为列名的行,默认值为0,即取第1行的值为列名。数据为除列名以外的数据;若数据不包含列名,则设置header=None。

 names:默认值为None,要使用的列名列表。

 index_col:指定列为索引列,默认值为None,索引0是DataFrame的行标签。

 usecols:int、list列表或字符串,默认值为None。

 如果为None,则解析所有列。

 如果为int,则解析最后一列。

 如果为list列表,则解析列号列表的列。

 如果为字符串,则表示以逗号分隔的Excel列字母和列范围列表(例如“A:E”或“A,C,E:F”)。范围包括双方。

 dtype:列的数据类型名称或字典,默认值为None。例如{'a':np.float64,'b':np.int32}。

 parse_dates:布尔类型值、int类型值的列表、列表或字典,默认值为False。可以通过parse_dates参数直接将某列转换成datetime64日期类型。例如,df1=pd.read_csv('1月.csv', parse_dates=['订单付款时间'])。

 parse_dates为True时,尝试解析索引。

 parse_dates为int类型值组成的列表时,如[1,2,3],则解析1、2、3列的值作为独立的日期列。

 parse_date为列表组成的列表,如[[1,3]],则将1、3列合并,作为一个日期列使用。

 parse_date为字典时,如{'总计':[1, 3]},则将1、3列合并,合并后的列名为“总计”。

 encoding:字符串,默认值为None,文件的编码格式。Python常用的编码格式是UTF-8。

 返回值:返回一个DataFrame。

【示例16】 导入.csv文件。(示例位置:资源包\MR\Code\03\16)

导入.csv文件,程序代码如下:

01 import pandas as pd
02 df1=pd.read_csv('1月.csv',encoding='gbk')        #导入.csv文件,并指定编码格式
03 df1=df1.head()                                   #输出前5条数据

运行程序,输出结果如图3.22所示。

图3.22 导入.csv文件

注意

上述代码中指定了编码格式,即encoding='gbk'。Python常用的编码格式是UTF-8和gbk,默认编码格式为UTF-8。导入.csv文件时,需要通过encoding参数指定编码格式。当将Excel文件另存为.csv文件时,默认编码格式为gbk,此时当编写代码导入.csv文件时,就需要设置编码格式为gbk,与源文件编码格式保持一致;否则会提示错误。

3.4.3 导入.txt文本文件

导入.txt文件同样使用Pandas的read_csv()方法,不同的是需要指定sep参数(如制表符\t)。read_csv()方法读取.txt文件返回一个DataFrame,像表格一样的二维数据结构,如图3.23所示。

【示例17】 导入.txt文件。(示例位置:资源包\MR\Code\03\17)

下面使用read_csv()方法导入1月.txt文件,主要代码如下:

01 import pandas as pd
02 df1=pd.read_csv('1.txt',sep='\t',encoding='gbk')
03 print(df1.head())

运行程序,输出结果如图3.24所示。

图3.23 .txt文件形式

图3.24 导入.txt文本

3.4.4 导入HTML网页

导入HTML网页数据主要使用Pandas的read_html()方法,该方法用于导入带有table标签的网页表格数据,语法如下:

pandas.read_html(io,match='.+',flavor=None,header=None,index_col=None,skiprows=None,attrs=None,parse_
dates=False,thousands=',',encoding=None,decimal='.',converters=None,na_values=None,keep_default_na=True,
displayed_only=True)

常用参数说明:

 io:字符串,文件路径,也可以是URL链接。网址不接受https,可以尝试去掉https中的s后爬取,如http://www.mingribook.com。

 match:正则表达式,返回与正则表达式匹配的表格。

 flavor:解析器默认为lxml。

 header:指定列标题所在的行,列表list为多重索引。

 index_col:指定行标题对应的列,列表list为多重索引。

 encoding:字符串,默认为None,文件的编码格式。

 返回值:返回一个DataFrame。

使用read_html()方法前,首先要确定网页表格是否为table类型。例如,NBA球员薪资网页(http://www.espn.com/nba/salaries),右击该网页中的表格,在弹出的快捷菜单中选择“检查元素”命令,查看代码中是否含有表格标签<table>…</table>的字样,如图3.25所示。确定后才可以使用read_html()方法。

图3.25 <table>…</table>表格标签

【示例18】 导入NBA球员薪资数据。(示例位置:资源包\MR\Code\03\18)

下面使用read_html()方法导入NBA球员薪资数据,程序代码如下:

运行程序,输出结果如图3.26所示。

图3.26 导入网页数据

注意

运行程序,如果出现ImportError: lxml not found, please install it错误提示信息,则需要安装lxml模块。