给自己的Python小笔记- 数据处理必备技能- 将外部数据集Excel档转成可操作的DataFrame - read_excel() 参数详细介绍与教学
嗨嗨,今天来介绍一个我在工作上常用到的一个函式- pandas.read_excel(),它帮助我读取Excel档的资料,并转换成Python可以进行数据处理的DataFrame格式,是一个非常常用的函式过去我导入的数据集(Excel档)几乎都只有一张工作表work sheet,所以一导入就是我要的资料,但就在距离今天不久前,我同事找我分析某份数据集,但它是在某份Excel档中的第二个工作表(work sheet)里,当然也是有很麻烦的解决办法,就是复制第二张工作表的内容,然后贴到另一份新的Excel档中,就搞定了,但是我总不能每次都这样,要是有上万份的档案,都要这样处理,我就Amazing了XD,所以我就想仔细地了解一下pandas.read_excel()底下到底有哪些参数可以使用,是否可以帮助我解决这个问题,并把我学习到的记录下来,帮助自己与有需要的大家,下次遇到这个问题,就能够轻松解决
pandas.read_excel()是要做什么的?
- 它帮助我们将Excel档导入进我们的Python程式中,并转换成DataFrame格式,方便我们使用Python来对数据进行操作,
- 它可以导入我们Local端的文件,或从URL上读取文件,像是Github就有像https://raw.githubusercontent.com/plotly/datasets/master/data.csv这样的网址可以读取网址上的csv数据集data
- 但它所导入的副档名须符合像xls, xlsx. xlsm, xlsb和odf的档案
pandas.read_excel()参数
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, nrows=None, na_values=None, keep_default_na=True, verbose=False, parse_dates=False, date_parser=None, thousands=None, comment=None, skipfooter=0, convert_float=True, mangle_dupe_cols=True, **kwds)
我接下来会用实作的方式带大家了解这些参数的意义
补充: 如何使用Jupyter Notebook快速取得这个函数的参数,以及这个参数的说明呢?
两种方式
- 第一种: 使用help()函数来帮忙,像是help(pd.read_excel)
- 第二种: 把pd.read_excel()打字的输入线移到函数括号内,并按下Shift + Tab,就会跳出资讯了
实作用的数据介绍
这份是我自己捏造的数据集喔,我有放在Github上,大家可以下载下来当练习用,这份Excel档中,有三页工作表,如下图第一张工作表是顾客的基本资料,第二张是消费记录表,第三张是旅游记录表
图一: 数据集Excrl档中- 有三页工作表
图二: 第一张工作表
图三: 第二张工作表
图四: 第三张工作表
参数的介绍与实作
1. io: 欲导入的Excel档路径与档名,像是io = "填入位置路径+ 档名",也可以直接省略io =,直接填入位置路径加档名就好
程式码范例
## 导入Pandas 套件import pandas as pd ## 读取档案df = pd.read_excel('data/dataset_example.xlsx') ## 显示资料df
执行结果
2. sheet_name(str, int, list, or None, default 0) : 读取指定的工作表
可以传入参数的格式
- 传入整数(ex. 0,1,2...): 指定特定位置的工作表,像0就是第一张工作表,1就是第二张工作表,以此类推,预设为0,表示导入第一张工作表,并转换返回一个DataFrame格式的资料表
- 传入字串(string): 指定特定名称的工作表,像是"Consumption_Record"就是指定导入名称为"Consumption_Record"的工作表,并转换返回一个DataFrame格式的资料表
- 传入串列(ex. [0,1]): 一次导入多个工作表,像[0,1]就是指一次导入第一张与第二张工作表,也可以像[2,"Consumption_Record"]就是导入第三张与名为"Consumption_Record"的工作表,它会返回一个OrderDict类型的数据,并会将这些工作表合并于一个list中
- 传入None: 表示将全部工作表载入,它会返回一个OrderDict类型的数据,并会将这些数据合并在一个list中
程式码范例
## 导入pandas套件import pandas as pd ## 读取第三章工作表a_int = pd.read_excel('data/dataset_example.xlsx', sheet_name = 2) ## 读取'Consumption_Record'工作表b_string = pd.read_excel(io = 'data/dataset_example.xlsx', sheet_name = 'Consumption_Record') ## 读取第一张与第三张的工作表c_list = pd.read_excel(io = 'data/dataset_example.xlsx', sheet_name = [0,2]) ## 读取第三张与'Consumption_Record'工作表d_list = pd.read_excel(io = 'data/dataset_example.xlsx', sheet_name = [2, 'Consumption_Record']) ## 读取全部的工作表e_all = pd.read_excel(io = 'data/dataset_example.xlsx', sheet_name = None)
执行结果
- 补充: 从上面的结果,如果我们是传入一个串列list,像是c_list与d_list那样,就可以在结果上用像是c_list[2], d_list["Consumption_Record"],来将合并成OrderDict的数据类型,再次分开成单独的DataFrame格式,但要指定为我们sheet_name的切割方式,像是如下的程式码,如果我输入c_list[1]这样会报错,大家要注意这一点
- 程式码范例
## 显示数据#c_list[0] c_list[2] ## 显示数据#d_list[2] d_list['Consumption_Record']
执行结果
3. header(int, list of int, default 0): 指定哪一列为最上方的列名
参数可以传入的格式
- 整数(int): 传入1,代表指定第二列为列名,以此类推,预设为0,代表指定第一列为列名
- 串列:将串列中的列位置都当成是列名,让多列同时成为列名,像是[0,1,2]就是将第1、2、3列都成为列名
- 传入None: 表示不使用任何数据里的列当成是列名
- 程式码范例
## 导入pandas套件import pandas as pd ## 读取第一张工作表,且以第一列当列名a_int = pd.read_excel('data/dataset_example.xlsx', header = 0) ## 读取第一张工作表,且以第三列为列名b_int = pd.read_excel('data/dataset_example.xlsx', header = 2) ## 读取第一张工作表,且以第一,二,三列当列名c_list = pd.read_excel('data/dataset_example.xlsx', header = [0,1,2]) ## 读取第一张工作表,且不以任何数据列当列名d = pd.read_excel('data/dataset_example.xlsx', header = None)
执行结果
- 小提醒: 当指定列名为原数据的哪些列或哪一列时,在它上面的列都会被拿掉,像是header = 2的话,原数据前二列的数据就会被拿掉,只产生指定第三列以下的数据列
4. names(array-like, default None): 指定一个自定义的列名
可以传入参数的格式
- 串列(list): 传入自定义的名称,但要注意数量要与原数据的列名一样数量
- 程式码范例
## 导入pandas套件import pandas as pd a_list = pd.read_excel('data/dataset_example.xlsx', names = ['顾客编号', '姓名', '年龄', '身高', '体重', '性别', '职业']) ## 显示数据a_list
执行结果
5. nrows(int default None): 指定欲读取前多少行
可以传入参数的格式
- 整数(int): 传入整数,像是传入6代表读取前面6行程式码范例
## 导入pandas套件import pandas as pd ## 只导入前四行数据a_int = pd.read_excel('data/dataset_example.xlsx', nrows = 4) ## 显示数据a_int
执行结果
6. na_values(scaler, str, list-like, or dict, default None): 将指定的栏位字串,改成NaN
可以传入参数的格式
- 字串(str):像是如果是用我的范围数据集传入'M',就会将所有'M'的栏位改成NaN
- 程式码范例
## 导入pandas套件import pandas as pd ## 将所有'M'的栏位改成NaN a_str = pd.read_excel('data/dataset_example.xlsx', na_values = 'M') ## 显示数据a_str
执行结果
7. keep_default_na(bool, default True): 是否将原本为空值的数据导入,并给予NaN
可以传入参数的格式
- Boolean: 传入True 或False,预设为True,代表导入空值,并填为NaN
- 程式码范例
## 导入pandas套件import pandas as pd ## 不要传入有空值的数据a_bool = pd.read_excel('data/dataset_example.xlsx', keep_default_na = False) ## 显示数据a_bool
执行结果
8. skiprows(list-like): 将指定的行数跳过不导入进来
可以传入参数的格式
- 整数(int): 如果为1,就是跳过第一行,为6,就是跳过第6行,以此类推
- 串列(list): 可以指定跳过哪些行,像是[1,4,5,6] 就是跳过1,4,5,6行
- lambda函数: 可以使用lambda来指定欲跳过的行
- 程式码范例
## 导入pandas套件import pandas as pd ## 跳过第二行a_int = pd.read_excel('data/dataset_example.xlsx', skiprpws = 2) ## 跳过1,3,6行b_list = pd.read_excel('data/dataset_example.xlsx', skiprpws = [1,3,6]) ## 跳过偶数行c_func = pd.read_excel('data/dataset_example.xlsx', skiprpws = lambda x: x%2 == 0)
执行结果
9. index_col(int, list of int, default None): 指定哪一列为索引列
可以传入参数的格式
- 整数(int): 指定哪一列为索引列
- None: 为预设的值,代表它会自动帮我们创建一列,以0开始的索引列
- 串列(list): 指定哪些列为索引列
- 程式码范例
## 导入pandas套件import pandas as pd ## 把第一列当成索引列a_int = pd.read_excel('data/dataset_example.xlsx', index_col = 0) ## 不把数据中任何一列当成索引列b_none = pd.read_excel('data/dataset_example.xlsx', index_col = None) ## 把第一,四,六列当成索引列c_list = pd.read_excel('data/dataset_example.xlsx', index_col = [0,3,5])
执行结果
10. true_values & false_values(list, default None): 指定数据中的哪些值,为True或False
可以传入参数的格式
- 串列(list): 指定数据中哪些要转为True或False的值,像是true_values['M']就是把数据中的'M'转为True,false_values['M']就是把数据中的'M'转为False
- 程式码范例
## 导入pandas套件import pandas as pd ## 将数据集中的'M'改为True,'F'改为Fasle a_list = pd.read_excel('data/dataset_example.xlsx', true_values = ['M'], false_values = ['F']) ## 显示数据a_list
执行结果
11. dtype(Type name or dict of column -> type, default None): 改变数据类型,预设为None,代表不改变原数据类型
可以传入参数的格式
- Pandas 所以包含的所有数据类型
- 程式码范例
原本的数据类型
## 导入pandas套件import pandas as pd ## 导入原本数据的前七行数据a = pd.read_excel('data/dataset_example.xlsx', nrows = 7) ## 显示数据资讯a.info()
更改过后的数据类型:先将最后一列NaN值拿掉,并将Age, Height 和Weight改为浮点数类型
## 导入pandas套件import pandas as pd ## 先将最后一列有NaN值得拿掉,并将Age、Height和Weight改为浮点数类型a = pd.read_excel('data/dataset_example.xlsx', nrows = 7, dtype = {2: 'float64', 3:'float64', 4:'float64'}) ## 显示数据资讯a.info()
执行结果
12. usecols(int, str, list-like, or callable default None): 指定读取excel中哪些列
可以传入参数的格式
- 串列(list): 指定要解析哪几列
- None: 预设值为None,代表解析所有列
- 字串(list): 指定Excel档中列的字母序号,使用":"来代表列字母序号的范围,","来代表要指定哪些列,像是"A:E",代表解析A到E列,而"A,C,E:F",代表解析A、E和E到F列
- 程式码范例
## 导入pandas套件import pandas as pd ## 指定解析第1与4列a_list = pd.read_excel('data/dataset_example.xlsx', usecols = [0,3]) ## 指定解析A列到C列a_str1 = pd.read_excel('data/dataset_example.xlsx', usecols = 'A:C') ## 指定解析A列到C列a_str2 = pd.read_excel('data/dataset_example.xlsx', usecols = 'A,C') ## 指定解析A列、B列和D到F列a_str3 = pd.read_excel('data/dataset_example.xlsx', usecols = 'A,B ,D:F')
执行结果
13. squeeze(bool, default False): 当指定解析只有一列时,会回传成Series格式
可以传入参数的格式
- Boolean: True 或False,预设为False,为True时,当指定解析的只有一列,会回传成Series格式
- 程式码范例
## 导入pandas套件import pandas as pd ## 指定解析一列,并回传成Series格式a = pd.read_excel('data/dataset_example.xlsx', usecols = [2], squeeze = True) ## 显示数据类型print(type(a)) ## 显示数据a
执行结果
14. engine(str, default None): 使用哪种的第三方解析库,都是用来解析Excel档的
可以传入参数的格式
- 第三方解析库: xlrd, openpyxl, odf
- None: 为预设值,代表不需要使用第三方解析库
15. converters(dict, default None): 使用函数来对指定的列,进行自定义的数据处理,可以使用Python的def或lambda方法
可以传入参数的格式
- 字典(dict): 第一个参数是key,为指定的列名或列的序列码,为函数,可以使用Python的def或lambda方法
- 程式码范例
## 导入pandas套件import pandas as pd ##将Customer_id那一列都加上100,然后Age那一列,在后面都加上years old a = pd.read_excel('data/dataset_example.xlsx', converters = {0: lambda x: x+100, 2: lambda x: str(x) + " years old"}) ## 显示数据a
执行结果
- 补充: 更多使用Pandas来导入不同文件格式方法,可以直接参考官网( https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-read-csv-table)的整理喔
当然还有一些参数我没有介绍到,但这边列出了许多我们比较常用到的参数,如果大家想了解更多,可以直接使用help(pandas.read_excel)这个方法来查询所有参数的用法说明喔,对这个方法有了很大的了解后,日后我们需要导入Excel档的时候,就能在导入前先进行初步的数据处理了,像是我们可以先指定好要解析导入哪些列,才不用通通都导入后,再把用不到的列拿掉,如果遇到拥有很多工作表的时候,也能轻松指定我们欲导进来的工作表喔
Reference
https://zhuanlan.zhihu.com/p/142972462
https://blogs.csdn.net/brucewong0516/article/details/79096633
喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!
- 来自作者
- 相关推荐