【Python】Pandas读存Excel大全

公众号:尤而小屋
作者:Peter
编辑:Peter

本文记录的是如何通过Pandas来读取Excel文件,以及如何将DataFrame保存到Excel文件中

官网参数详解:https://pandas.pydata.org/docs/reference/api/pandas.read_excel.html

参数

read_excel函数能够读取的格式包含:xls, xlsx, xlsm, xlsb, odf, ods 和 odt 文件扩展名。支持读取单一sheet或几个sheet。

下面记录的官方文档中提供的全部参数信息:

pandas.read_excel(
  io,    
  sheet_name=0, 
  header=0, 
  names=None, 
  index_col=None, 
  usecols=None, 
  squeeze=None, 
  dtype=None, 
  engine=None, 
  converters=None, 
  true_values=None, 
  false_values=None, 
  skiprows=None, 
  nrows=None, 
  na_values=None,
  keep_default_na=True, 
  na_filter=True, 
  verbose=False, 
  parse_dates=False, 
  date_parser=None, 
  thousands=None, 
  decimal='.', 
  comment=None, 
  skipfooter=0, 
  convert_float=None, 
  mangle_dupe_cols=True, 
  storage_options=None
)

下面解释常用参数的含义:

  • io:文件路径,支持 str, bytes, ExcelFile, xlrd.Book, path object, or file-like object。默认读取第一个sheet的内容。案例:"/desktop/student.xlsx"

  • sheet_name:sheet表名,支持 str, int, list, or None;默认是0,索引号从0开始,表示第一个sheet。案例:sheet_name=1, sheet_name="sheet1",sheet_name=[1,2,"sheet3"]。None 表示引用所有sheet

  • header:表示用第几行作为表头,支持 int, list of int;默认是0,第一行的数据当做表头。header=None表示不使用数据源中的表头,Pandas自动使用0,1,2,3…的自然数作为索引。

  • names:表示自定义表头的名称,此时需要传递数组参数。

  • index_col:指定列属性为行索引列,支持 int, list of int, 默认是None,也就是索引为0,1,2,3等自然数的列用作DataFrame的行标签。如果传入的是列表形式,则行索引会是多层索引

  • usecols:待解析的列,支持 int, str, list-like, or callable ,默认是 None,表示解析全部的列。

  • dtype:指定列属性的字段类型。案例:{‘a’: np.float64, ‘b’: np.int32};默认为None,也就是不改变数据类型。

  • engine:解析引擎;可以接受的参数有"xlrd"、"openpyxl"、"odf"、"pyxlsb",用于使用第三方的库去解析excel文件

    • “xlrd”支持旧式 Excel 文件 (.xls)

    • “openpyxl”支持更新的 Excel 文件格式

    • “odf”支持 OpenDocument 文件格式(.odf、.ods、.odt)

    • “pyxlsb”支持二进制 Excel 文件

  • converters:对指定列进行指定函数的处理,传入参数为列名与函数组成的字典,和usecols参数连用。key 可以是列名或者列的序号,values是函数,可以自定义的函数或者Python的匿名lambda函数

  • skiprows:跳过指定的行(可选参数),类型为:list-like, int, or callable

  • nrows:指定读取的行数,通常用于较大的数据文件中。类型int, 默认是None,读取全部数据

  • na_values:指定列的某些特定值为NaN

  • keep_default_na:是否导入空值,默认是导入,识别为NaN

模拟数据

现在本次模拟了两个数据:Pandas_Excel.xls 和 Pandas_Excel.xlsx

Pandas_Excel.xls 文件中包含两个sheet,第二个数据只比第一个多个index的信息

1、sheet1的内容

707dba0001854003a9308a4b38461b68.png
image-20220423115151077

2、sheet2的内容

4f0ff7b77c4c00f53084b77a3314cb1b.png

3、Pandas_Excel.xlsx的内容,模拟的完整信息:

4cd8af873a164e53b743e557fbbd9267.png
import pandas as pd

默认情况

此时文件刚好在当前目录下,读取的时候指定文件名即可,可以看到读取的是第一个sheet

df = pd.read_excel("Pandas-Excel.xls")
df

nameagesexaddressdate
0张三23深圳2022-04-01
1李四16广州2022-04-02
2小明26未知深圳2022-04-05
3张飞28苏州2021-09-08
4小苏20NaN2022-06-07
5小王0南京2022-05-09

参数io

填写完整的文件路径作为io的取值。也可以使用相对路径

pd.read_excel(r"/Users/peter/Desktop/pandas/Pandas-Excel.xls")

nameagesexaddressdate
0张三23深圳2022-04-01
1李四16广州2022-04-02
2小明26未知深圳2022-04-05
3张飞28苏州2021-09-08
4小苏20NaN2022-06-07
5小王0南京2022-05-09

参数sheet_name

# pd.read_excel("Pandas-Excel.xls", sheet_name=0) # 效果同上

# 直接指定sheet的名字
pd.read_excel("Pandas-Excel.xls", sheet_name="Sheet1") # 效果同上

nameagesexaddressdate
0张三23深圳2022-04-01
1李四16广州2022-04-02
2小明26未知深圳2022-04-05
3张飞28苏州2021-09-08
4小苏20NaN2022-06-07
5小王0南京2022-05-09

换成读取第二个sheet:名称是Sheet2

pd.read_excel("Pandas-Excel.xls", sheet_name="Sheet2")

indexnameagesexaddressdate
01张三23深圳2022-04-01
12李四16广州2022-04-02
23小明26未知深圳2022-04-05
34张飞28苏州2021-09-08
45小苏20NaN2022-06-07
56小王0南京2022-05-09

结果中多了一列index的取值

参数header

# 和默认情况相同

pd.read_excel("Pandas-Excel.xls", header=[0])

nameagesexaddressdate
0张三23深圳2022-04-01
1李四16广州2022-04-02
2小明26未知深圳2022-04-05
3张飞28苏州2021-09-08
4小苏20NaN2022-06-07
5小王0南京2022-05-09
pd.read_excel("Pandas-Excel.xls", header=[1])  # 单个元素

第一行的数据当做列属性:


张三23深圳2022-04-01 00:00:00
0李四16广州2022-04-02
1小明26未知深圳2022-04-05
2张飞28苏州2021-09-08
3小苏20NaN2022-06-07
4小王0南京2022-05-09

传入多个元素会形成多层索引:

pd.read_excel("Pandas-Excel.xls", header=[0,1])   # 多个元素

nameagesexaddressdate

张三23深圳2022-04-01 00:00:00
0李四16广州2022-04-02
1小明26未知深圳2022-04-05
2张飞28苏州2021-09-08
3小苏20NaN2022-06-07
4小王0南京2022-05-09

参数names

# 指定列名称

pd.read_excel("Pandas-Excel.xls", names=["a","b","c","d","e"])

abcde
0张三23深圳2022-04-01
1李四16广州2022-04-02
2小明26未知深圳2022-04-05
3张飞28苏州2021-09-08
4小苏20NaN2022-06-07
5小王0南京2022-05-09

参数index_col

# 指定单个元素作为索引
pd.read_excel("Pandas-Excel.xls", index_col=[0])

agesexaddressdate
name



张三23深圳2022-04-01
李四16广州2022-04-02
小明26未知深圳2022-04-05
张飞28苏州2021-09-08
小苏20NaN2022-06-07
小王0南京2022-05-09
# 多个元素
pd.read_excel("Pandas-Excel.xls", index_col=[0,1])


sexaddressdate
nameage


张三23深圳2022-04-01
李四16广州2022-04-02
小明26未知深圳2022-04-05
张飞28苏州2021-09-08
小苏20NaN2022-06-07
小王0南京2022-05-09

参数usecols

pd.read_excel("Pandas-Excel.xls", usecols=[0])   # 单个字段

name
0张三
1李四
2小明
3张飞
4小苏
5小王
pd.read_excel("Pandas-Excel.xls", usecols=[0,2,4])   # 多个字段

namesexdate
0张三2022-04-01
1李四2022-04-02
2小明未知2022-04-05
3张飞2021-09-08
4小苏2022-06-07
5小王2022-05-09
# 直接指定名称
    
pd.read_excel("Pandas-Excel.xls", usecols=["age","sex"])

agesex
023
116
226未知
328
420
50
# 传入匿名函数,字段中包含a,结果sex没有了

pd.read_excel("Pandas-Excel.xls", usecols=lambda x: "a" in x)

nameageaddressdate
0张三23深圳2022-04-01
1李四16广州2022-04-02
2小明26深圳2022-04-05
3张飞28苏州2021-09-08
4小苏20NaN2022-06-07
5小王0南京2022-05-09

参数dtype

df.dtypes
name               object
age                 int64
sex                object
address            object
date       datetime64[ns]
dtype: object

从上面的结果中看到age字段,在默认情况下读取的是int64类型:

# 指定数据类型
df1 = pd.read_excel("Pandas-Excel.xls", dtype={"age":"float64"})

# 查看字段信息
df1.dtypes
name               object
age               float64  # 修改
sex                object
address            object
date       datetime64[ns]
dtype: object

参数engine

# xls 结尾

pd.read_excel("Pandas-Excel.xls", engine="xlrd")

nameagesexaddressdate
0张三23深圳2022-04-01
1李四16广州2022-04-02
2小明26未知深圳2022-04-05
3张飞28苏州2021-09-08
4小苏20NaN2022-06-07
5小王0南京2022-05-09
# xlsx 结尾
pd.read_excel("Pandas-Excel.xlsx", engine="openpyxl")

nameagesexaddressdate
0张三23深圳2022-04-01
1李四16广州2022-04-02
2小明26深圳2022-04-05
3张飞28苏州2021-09-08
4小苏20杭州2022-06-07
5小王25南京2022-05-09

参数converters

pd.read_excel("Pandas-Excel.xlsx")  # 默认操作

nameagesexaddressdate
0张三23深圳2022-04-01
1李四16广州2022-04-02
2小明26深圳2022-04-05
3张飞28苏州2021-09-08
4小苏20杭州2022-06-07
5小王25南京2022-05-09
pd.read_excel("Pandas-Excel.xlsx", 
              usecols=[1,3],  # 1-age  3-address 数值为原索引号
              converters={0:lambda x: x+5,  # 0代表上面[1,3]中的索引号
                          1:lambda x: x + "市"
                         })

ageaddress
028深圳市
121广州市
231深圳市
333苏州市
425杭州市
530南京市

参数skiprows

pd.read_excel("Pandas-Excel.xls")   # 默认情况

nameagesexaddressdate
0张三23深圳2022-04-01
1李四16广州2022-04-02
2小明26未知深圳2022-04-05
3张飞28苏州2021-09-08
4小苏20NaN2022-06-07
5小王0南京2022-05-09

把张三和李四所在的行直接跳过:

pd.read_excel("Pandas-Excel.xls", skiprows=2)

李四16广州2022-04-02 00:00:00
0小明26未知深圳2022-04-05
1张飞28苏州2021-09-08
2小苏20NaN2022-06-07
3小王0南京2022-05-09
# 跳过偶数行

pd.read_excel("Pandas-Excel.xls", skiprows=lambda x: x%2 == 0)

张三23深圳2022-04-01 00:00:00
0小明26未知深圳2022-04-05
1小苏20NaN2022-06-07

参数nrows

# 指定读取的行数

pd.read_excel("Pandas-Excel.xls", nrows=2)

nameagesexaddressdate
0张三23深圳2022-04-01
1李四16广州2022-04-02

参数na_values

pd.read_excel("Pandas-Excel.xls")  # 默认

nameagesexaddressdate
0张三23深圳2022-04-01
1李四16广州2022-04-02
2小明26未知深圳2022-04-05
3张飞28苏州2021-09-08
4小苏20NaN2022-06-07
5小王0南京2022-05-09
pd.read_excel("Pandas-Excel.xls", 
              na_values={"sex":"未知"})

sex字段中的未知显示成了NaN:


nameagesexaddressdate
0张三23深圳2022-04-01
1李四16广州2022-04-02
2小明26NaN深圳2022-04-05
3张飞28苏州2021-09-08
4小苏20NaN2022-06-07
5小王0南京2022-05-09

参数keep_default_na

pd.read_excel("Pandas-Excel.xls")  # 默认keep_default_na=True

nameagesexaddressdate
0张三23深圳2022-04-01
1李四16广州2022-04-02
2小明26未知深圳2022-04-05
3张飞28苏州2021-09-08
4小苏20NaN2022-06-07
5小王0南京2022-05-09
pd.read_excel("Pandas-Excel.xls", keep_default_na=False)

nameagesexaddressdate
0张三23深圳2022-04-01
1李四16广州2022-04-02
2小明26未知深圳2022-04-05
3张飞28苏州2021-09-08
4小苏20
2022-06-07
5小王0南京2022-05-09

输出到excel文件

简单模拟一份数据:

df2 = pd.DataFrame({"num1":[1,2,3],
                   "num2":[4,5,6],
                   "num3":[7,8,9]})
df2

num1num2num3
0147
1258
2369
df2.to_excel("newdata_1.xlsx")

效果如下:

1fd72c6cb3f78e641e1e323dcc1e428c.png
df2.to_excel("newdata_2.xlsx",index=False)

不会带上索引号

cd7b189f1825dffe802b5c66856a309f.png
 
 
 
 
 
 
 
 
 
 
往期精彩回顾




适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑
AI基础下载机器学习交流qq群955171419,加入微信群请扫码:

ea7b58aad0da6f975a22ec67ed1a2b14.png

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值