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

大家好,我是Peter~

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

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

参数

read_excel函数能够读取的格式包含xls, xlsx, xlsm, xlsb, odf, odsodt 文件扩展名。支持读取单一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
)

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

模拟数据

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

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

1、sheet1的内容

2、sheet2的内容

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

import pandas as pd

默认情况

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

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

参数io

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

pd.read_excel(r"/Users/peter/Desktop/pandas/Pandas-Excel.xls")
name age sex address date
0 张三 23 深圳 2022-04-01
1 李四 16 广州 2022-04-02
2 小明 26 未知 深圳 2022-04-05
3 张飞 28 苏州 2021-09-08
4 小苏 20 NaN 2022-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") # 效果同上
name age sex address date
0 张三 23 深圳 2022-04-01
1 李四 16 广州 2022-04-02
2 小明 26 未知 深圳 2022-04-05
3 张飞 28 苏州 2021-09-08
4 小苏 20 NaN 2022-06-07
5 小王 0 南京 2022-05-09

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

pd.read_excel("Pandas-Excel.xls", sheet_name="Sheet2") 
index name age sex address date
0 1 张三 23 深圳 2022-04-01
1 2 李四 16 广州 2022-04-02
2 3 小明 26 未知 深圳 2022-04-05
3 4 张飞 28 苏州 2021-09-08
4 5 小苏 20 NaN 2022-06-07
5 6 小王 0 南京 2022-05-09

结果中多了一列index取值

参数header

# 和默认情况相同

pd.read_excel("Pandas-Excel.xls", header=[0]) 
name age sex address date
0 张三 23 深圳 2022-04-01
1 李四 16 广州 2022-04-02
2 小明 26 未知 深圳 2022-04-05
3 张飞 28 苏州 2021-09-08
4 小苏 20 NaN 2022-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 小苏 20 NaN 2022-06-07
4 小王 0 南京 2022-05-09

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

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

参数names

# 指定列名

pd.read_excel("Pandas-Excel.xls", names=["a","b","c","d","e"])   
a b c d e
0 张三 23 深圳 2022-04-01
1 李四 16 广州 2022-04-02
2 小明 26 未知 深圳 2022-04-05
3 张飞 28 苏州 2021-09-08
4 小苏 20 NaN 2022-06-07
5 小王 0 南京 2022-05-09

参数index_col

# 指定单个元素作为索引
pd.read_excel("Pandas-Excel.xls", index_col=[0]) 
age sex address date
name
张三 23 深圳 2022-04-01
李四 16 广州 2022-04-02
小明 26 未知 深圳 2022-04-05
张飞 28 苏州 2021-09-08
小苏 20 NaN 2022-06-07
小王 0 南京 2022-05-09
# 多个元素
pd.read_excel("Pandas-Excel.xls", index_col=[0,1])   
sex address date
name age
张三 23 深圳 2022-04-01
李四 16 广州 2022-04-02
小明 26 未知 深圳 2022-04-05
张飞 28 苏州 2021-09-08
小苏 20 NaN 2022-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])   # 多个字段
name sex date
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"])  
age sex
0 23
1 16
2 26 未知
3 28
4 20
5 0
# 传入匿名函数,字段包含a,结果sex没有

pd.read_excel("Pandas-Excel.xls", usecols=lambda x: "a" in x)
name age address date
0 张三 23 深圳 2022-04-01
1 李四 16 广州 2022-04-02
2 小明 26 深圳 2022-04-05
3 张飞 28 苏州 2021-09-08
4 小苏 20 NaN 2022-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")
name age sex address date
0 张三 23 深圳 2022-04-01
1 李四 16 广州 2022-04-02
2 小明 26 未知 深圳 2022-04-05
3 张飞 28 苏州 2021-09-08
4 小苏 20 NaN 2022-06-07
5 小王 0 南京 2022-05-09
# xlsx 结尾
pd.read_excel("Pandas-Excel.xlsx", engine="openpyxl")
name age sex address date
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")  # 默认操作
name age sex address date
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 + "市"
                         })
age address
0 28 深圳市
1 21 广州市
2 31 深圳市
3 33 苏州市
4 25 杭州
5 30 南京市

参数skiprows

pd.read_excel("Pandas-Excel.xls")   # 默认情况
name age sex address date
0 张三 23 深圳 2022-04-01
1 李四 16 广州 2022-04-02
2 小明 26 未知 深圳 2022-04-05
3 张飞 28 苏州 2021-09-08
4 小苏 20 NaN 2022-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 小苏 20 NaN 2022-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 小苏 20 NaN 2022-06-07

参数nrows

# 指定读取的行数

pd.read_excel("Pandas-Excel.xls", nrows=2)
name age sex address date
0 张三 23 深圳 2022-04-01
1 李四 16 广州 2022-04-02

参数na_values

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

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

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

参数keep_default_na

pd.read_excel("Pandas-Excel.xls")  # 默认keep_default_na=True
name age sex address date
0 张三 23 深圳 2022-04-01
1 李四 16 广州 2022-04-02
2 小明 26 未知 深圳 2022-04-05
3 张飞 28 苏州 2021-09-08
4 小苏 20 NaN 2022-06-07
5 小王 0 南京 2022-05-09
pd.read_excel("Pandas-Excel.xls", keep_default_na=False)
name age sex address date
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
num1 num2 num3
0 1 4 7
1 2 5 8
2 3 6 9
df2.to_excel("newdata_1.xlsx")

效果如下

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

不会带上索引号

原文地址:https://blog.csdn.net/qq_25443541/article/details/124536974

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_31188.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注