给自己的Python小笔记- 数据处理必备技能- 将外部数据集Excel档转成可操作的DataFrame - read_excel() 参数详细介绍与教学

為自己Coding
·
·
IPFS
·


Github完整程式连结


摄影师:cottonbro,连结:Pexels


嗨嗨,今天来介绍一个我在工作上常用到的一个函式- 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

执行结果






当然还有一些参数我没有介绍到,但这边列出了许多我们比较常用到的参数,如果大家想了解更多,可以直接使用help(pandas.read_excel)这个方法来查询所有参数的用法说明喔,对这个方法有了很大的了解后,日后我们需要导入Excel档的时候,就能在导入前先进行初步的数据处理了,像是我们可以先指定好要解析导入哪些列,才不用通通都导入后,再把用不到的列拿掉,如果遇到拥有很多工作表的时候,也能轻松指定我们欲导进来的工作表喔



Reference

https://zhuanlan.zhihu.com/p/142972462

https://blogs.csdn.net/brucewong0516/article/details/79096633

CC BY-NC-ND 2.0 授权

喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!

為自己CodingYO~~ 剛跨入AI人工智慧領域的小小工程師, 熱愛自學, 熱愛分享, 下班後的我想為自己Coding, 積極撰寫教學文, 想將自學的程式知識分享給大家, 不斷追求進步的自己, 希望有一天能回饋社會,幫助需要幫助的人, 如果您有什麼很酷的想法,也覺得我還行,歡迎您找我合作~~ IG: https://www.instagram.com/coding_4_me/
  • 来自作者
  • 相关推荐

[Takeaways]原力效應 — Part1

[行銷5.0] 人工智慧的緣起

[Aptos學習筆記#8]Move進階使用 - Resource介紹一