Python 数据处理 —— pandas Excel 文件读写

Excel 文件

read_excel() 方法可以使用 openpyxl 模块读取 Excel 2007+.xlsx)文件

可以使用 xlrd 读取 Excel 2003(.xls)文件。可以使用 pyxlsb 读取二进制 Excel.xlsb)文件

to_excel() 实例方法可以用于将 DataFrame 保存到 Excel 文件

注意

用于写出旧式 .xls 文件的 xlwt 软件包不再维护。 xlrd 软件包现在仅用于读取旧式 .xls 文件

对于默认参数 engine=None, read_excel() 将使用 xlrd 引擎。

如果安装了 openpyxl,则现在许多情况下将默认使用 openpyxl 引擎。因此,强烈建议安装 openpyxl 来读取 Excel 2007+ (.xlsx)文件

1 读取 Excel 文件

在最基本的用例中,read_excel 采用一个指向 Excel 文件的路径,而 sheet_name 指示要解析的工作表。

# Returns a DataFrame
pd.read_excel("path_to_file.xls", sheet_name="Sheet1")
1.1 ExcelFile 类

为了方便处理来自同一文件的多个工作表,可以使用 ExcelFile 类包装文件并将其传递到 read_excel 中。

由于仅将文件读入内存一次,因此读取多个工作表会带来性能上的好处。

xlsx = pd.ExcelFile("path_to_file.xls")
df = pd.read_excel(xlsx, "Sheet1")

ExcelFile 类也可以用作上下文管理器

with pd.ExcelFile("path_to_file.xls") as xls:
    df1 = pd.read_excel(xls, "Sheet1")
    df2 = pd.read_excel(xls, "Sheet2")

sheet_names 属性将会获取文件中工作表名称列表

ExcelFile 的主要作用是用不同的参数解析多个工作表

data = {}
# For when Sheet1's format differs from Sheet2
with pd.ExcelFile("path_to_file.xls") as xls:
    data["Sheet1"] = pd.read_excel(xls, "Sheet1", index_col=None, na_values=["NA"])
    data["Sheet2"] = pd.read_excel(xls, "Sheet2", index_col=1)

请注意,如果所有工作表都使用相同的解析参数,则可以将工作表名称列表简单地传递给 read_excel,且不会降低性能。

# using the ExcelFile class
data = {}
with pd.ExcelFile("path_to_file.xls") as xls:
    data["Sheet1"] = pd.read_excel(xls, "Sheet1", index_col=None, na_values=["NA"])
    data["Sheet2"] = pd.read_excel(xls, "Sheet2", index_col=None, na_values=["NA"])

# equivalent using the read_excel function
data = pd.read_excel(
    "path_to_file.xls", ["Sheet1", "Sheet2"], index_col=None, na_values=["NA"]
)

还可以使用 xlrd.book.Book 对象作为参数来调用 ExcelFile。这允许用户控制如何读取 excel 文件。

例如,可以通过使用 xlrd.open_workbook() 函数并设置参数 on_demand=True,来按需加载工作表。

import xlrd

xlrd_book = xlrd.open_workbook("path_to_file.xls", on_demand=True)
with pd.ExcelFile(xlrd_book) as xls:
    df1 = pd.read_excel(xls, "Sheet1")
    df2 = pd.read_excel(xls, "Sheet2")
1.2 指定工作表

第二个参数是 sheet_name,不要与 ExcelFile.sheet_names 混淆

ExcelFile 的属性 sheet_names 用于访问所有工作表

  • sheet_name 参数用于指定要读取的一个或多个工作表
  • sheet_name 的默认值是 0,表示读取第一个工作表
  • 传递一个字符串来引用工作簿中特定工作表的名称
  • 传递一个整数来引用工作表的索引,索引从 0 开始
  • 传递一个字符串或整数列表,以返回指定工作表的 DataFrame 字典
  • 传递一个 None 来返回包含所有可用工作表的 DataFrame 字典

传入工作表名称

# Returns a DataFrame
pd.read_excel("path_to_file.xls", "Sheet1", index_col=None, na_values=["NA"])

传入工作表索引

# Returns a DataFrame
pd.read_excel("path_to_file.xls", 0, index_col=None, na_values=["NA"])

使用默认值

# Returns a DataFrame
pd.read_excel("path_to_file.xls")

使用 None 获取所有表

# Returns a dictionary of DataFrames
pd.read_excel("path_to_file.xls", sheet_name=None)

使用列表获取多个工作表

# Returns the 1st and 4th sheet, as a dictionary of DataFrames.
pd.read_excel("path_to_file.xls", sheet_name=["Sheet1", 3])
1.3 读取 MultiIndex

read_excel 可以通过对 index_col 传递一个列表读取多级索引,通过向 header 传递一个列表读取列名多级索引

例如,读取不带名称的 MultiIndex 索引

In [315]: df = pd.DataFrame(
   .....:     {"a": [1, 2, 3, 4], "b": [5, 6, 7, 8]},
   .....:     index=pd.MultiIndex.from_product([["a", "b"], ["c", "d"]]),
   .....: )
   .....: 

In [316]: df.to_excel("path_to_file.xlsx")

In [317]: df = pd.read_excel("path_to_file.xlsx", index_col=[0, 1])

In [318]: df
Out[318]: 
     a  b
a c  1  5
  d  2  6
b c  3  7
  d  4  8

如果索引具有级别名称,它们也将使用相同的参数进行解析

In [319]: df.index = df.index.set_names(["lvl1", "lvl2"])

In [320]: df.to_excel("path_to_file.xlsx")

In [321]: df = pd.read_excel("path_to_file.xlsx", index_col=[0, 1])

In [322]: df
Out[322]: 
           a  b
lvl1 lvl2      
a    c     1  5
     d     2  6
b    c     3  7
     d     4  8

如果源文件同时具有 MultiIndex 索引和列名,则应将它们对应的列表传递给 index_colheader 参数

In [323]: df.columns = pd.MultiIndex.from_product([["a"], ["b", "d"]], names=["c1", "c2"])

In [324]: df.to_excel("path_to_file.xlsx")

In [325]: df = pd.read_excel("path_to_file.xlsx", index_col=[0, 1], header=[0, 1])

In [326]: df
Out[326]: 
c1         a   
c2         b  d
lvl1 lvl2      
a    c     1  5
     d     2  6
b    c     3  7
     d     4  8
1.4 解析特定的列

read_excel 使用 usecols 关键字来允许您指定要读取的列的子集。

usecols 传入一个整数将不再有效。请将一个从 0 开始的列表传递给 usecols

您也可以将以逗号分隔的一组 Excel 列或数据表范围的字符串传递给 usecols

pd.read_excel("path_to_file.xls", "Sheet1", usecols="A,C:E")

如果 usecols 是整数列表,则假定它是文件的列索引

pd.read_excel("path_to_file.xls", "Sheet1", usecols=[0, 2, 3])

元素顺序并不重要,即 usecols=[0,1][1,0] 相同

如果 usecols 是一个字符串列表,则假定每个字符串都对应于文件的列名或从文档标题行推断出来的列名。

pd.read_excel("path_to_file.xls", "Sheet1", usecols=["foo", "bar"])

同样也会忽略列表元素的顺序

如果 usecols 是可调用函数,传入的是列名,返回可调用函数计算结果为 True 的列名

pd.read_excel("path_to_file.xls", "Sheet1", usecols=lambda x: x.isalpha())
1.5 解析日期

在读取 excel 文件时,类似 datetime 的值通常会自动转换为适当的 dtype

但是,如果你有一列字符串看起来像日期(但实际上不是格式化为 excel 中的日期),你可以使用 parse_dates 关键字将这些字符串解析为日期时间格式

pd.read_excel("path_to_file.xls", "Sheet1", parse_dates=["date_strings"])
1.6 单元格转换

可以通过 converters 选项转换 Excel 单元格的内容。例如,要将列转换为布尔值

pd.read_excel("path_to_file.xls", "Sheet1", converters={"MyBools": bool})

这个选项可以处理缺失值,并将转换时出现的异常作为缺失数据处理。变换是逐个单元格而不是对整个列进行的,所以不能保证数组的 dtype

def cfun(x):
    return int(x) if x else -1

pd.read_excel("path_to_file.xls", "Sheet1", converters={"MyInts": cfun})
1.7 指定类型

作为转换器的替代方法,可以使用 dtype 关键字指定整个列的类型,该关键字通过将字典的名称映射到列,值对应列的类型。

pd.read_excel("path_to_file.xls", dtype={"MyInts": "int64", "MyText": str})

2 写出 Excel 文件

2.1 将 Excel 文件写入磁盘

要将 DataFrame 对象写入 Excel 文件的工作表中,可以使用 to_excel 实例方法。

其参数与 to_csv 基本相同,第一个参数是 excel 文件的名称,第二个可选参数是数据写入到的工作表的名称。例如:

df.to_excel("path_to_file.xlsx", sheet_name="Sheet1")

扩展名为 .xls 的文件将使用 xlwt 写出,扩展名为 .xlsx 的文件将使用 xlsxwriter(如果可用)或 openpyxl 编写。

可以使用 index_label 参数设置索引名称,如果是多级索引,需要传递名称列表

merge_cells 参数可以设置多级索引是否合并单元格,默认为 TRUE,如果为 False,则会写出所有的索引值

df.to_excel("path_to_file.xlsx", index_label="label", merge_cells=False)

为了在一个 Excel 文件中写入不同的 DataFrame,可以传递一个 ExcelWriter

with pd.ExcelWriter("path_to_file.xlsx") as writer:
    df1.to_excel(writer, sheet_name="Sheet1")
    df2.to_excel(writer, sheet_name="Sheet2")

注意
因为 Excel 默认将所有数字存储为浮点数,在不损失精度的情况下,pandas 默认会尝试将整数转换为浮点数。

你可以设置 convert_float=False 来取消这一行为,可能会带来性能的提升

2.2 将 Excel 文件写入内存

pandas 支持使用 ExcelWriterExcel 文件写入到类似缓冲区的对象中,如 StringIOBytesIO

from io import BytesIO

bio = BytesIO()

# By setting the 'engine' in the ExcelWriter constructor.
writer = pd.ExcelWriter(bio, engine="xlsxwriter")
df.to_excel(writer, sheet_name="Sheet1")

# Save the workbook
writer.save()

# Seek to the beginning and read to copy the workbook to a variable in memory
bio.seek(0)
workbook = bio.read()

注意
engine 参数是可选的,但是推荐为该参数指定值

设置 engine='xlrd' 将生成 excel2003 格式的工作簿(xls)。使用 "openpyxl""xlsxwriter" 将生成 excel2007 格式的工作簿(xlsx)。

如果省略,则生成 Excel 2007 格式的工作簿

3 Excel 写出引擎

1.2.0 版本后,由于 xlwt 包不再维护,xlwt 引擎将从 pandas 的未来版本中移除。

这是 pandas 中唯一支持写入 .xls 文件的引擎

pandas 通过两种方法选择 Excel 写出引擎

  1. engine 参数
  2. 文件扩展名(通过配置选项中指定的默认值)

默认情况下,pandas.xlsx 使用 XlsxWriter,对 .xlsm 使用 openpyxl,对 .xls 文件使用 xlwt

如果您安装了多个引擎,则可以通过设置配置选项 io.excel.xlsx.writerio.excel.xls.writer 来设置默认引擎

如果 Xlsxwriter 不可用,pandas 将使用 openpyxl 来获取 .xlsx 文件。

要指定要使用哪个写出引擎,可以将 engine 关键字参数传递给 to_excelExcelWriter。内置引擎为

  • openpyxl: 需要 2.4 或更高版本
  • xlsxwriter
  • xlwt
# By setting the 'engine' in the DataFrame 'to_excel()' methods.
df.to_excel("path_to_file.xlsx", sheet_name="Sheet1", engine="xlsxwriter")

# By setting the 'engine' in the ExcelWriter constructor.
writer = pd.ExcelWriter("path_to_file.xlsx", engine="xlsxwriter")

# Or via pandas configuration.
from pandas import options  # noqa: E402

options.io.excel.xlsx.writer = "xlsxwriter"

df.to_excel("path_to_file.xlsx", sheet_name="Sheet1")

4 样式和格式

可以使用 to_excel 方法中的以下参数来修改创建的 Excel 工作表的外观和感觉

  • float_format: 浮点数的格式化字符串(默认为 None
  • freeze_panes: 包含两个整数的元组,表示冻结最底行和最后列范围内的单元格。这些数值是 1 起始的,因此 (1, 1) 将冻结第一行和第一列(默认为 None

使用 Xlsxwriter 引擎可以提供许多选项来控制用 to_excel 方法创建的 Excel 工作表的格式

具体可参考 https://xlsxwriter.readthedocs.io/working_with_pandas.html

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Python中的Pandas是一个常用的数据处理库,它可以轻松地将Excel数据导入到Python中进行处理。使用Pandas,你可以轻松地读取、筛选、操作和写入Excel数据,同时还可以对数据进行分析和可视化。下面是使用Pandas进行Excel数据处理的一些常用步骤: 1. 导入Pandas库:首先需要在Python中导入Pandas库,通常使用“import pandas as pd”的语句进行导入。 2. 读取Excel数据:使用Pandas的“read_excel()”函数可以轻松地读取Excel数据,并将其转换为Pandas数据框。例如:df = pd.read_excel('data.xlsx')。 3. 数据清洗和处理:使用Pandas的数据操作功能可以对数据进行清洗和处理。例如:可以使用“dropna()”函数删除缺失值,使用“groupby()”函数对数据进行分组等。 4. 数据分析和可视化:使用Pandas的数据分析和可视化功能可以对数据进行分析和可视化。例如:可以使用“describe()”函数查看数据的基本统计信息,使用“plot()”函数绘制数据的可视化图表等。 5. 写入Excel数据:使用Pandas的“to_excel()”函数可以将处理后的数据写入到Excel中。例如:df.to_excel('result.xlsx')。 总之,使用Pandas可以让你更加高效地处理Excel数据,并且可以使用Python的强大功能进行数据分析和可视化。 ### 回答2: Python是一门强大的编程语言,它可以很好地用来处理和分析数据。而Excel是一个广泛使用的办公软件,它也包含了一些数据处理和分析的功能。那么,如何将PythonExcel结合起来,实现更高效、更灵活的数据处理过程呢?这时就需要用到Pandas这个Python库了。 PandasPython数据处理库中的一个重要工具,它提供了基于Numpy的数据结构和函数,以及其他数据处理工具,大大简化了数据处理的流程。Pandas最常用的两种数据结构是Series和DataFrame。Series是一种一维数组,它可以存储任何类型的数据,而DataFrame则是一种类似于表格的二维数据结构,可以存储多种类型的数据。 使用PandasExcel数据进行处理的基本步骤如下: 1. 导入Pandas库。首先要导入Pandas库,这可通过以下命令完成: import pandas as pd 2. 读取Excel文件。可以使用Pandas的read_excel()函数来读取Excel文件。读取Excel文件的语法格式如下: pd.read_excel('文件名.xlsx', sheet_name='工作表名') 3. 数据处理。读取Excel文件数据后,就可以使用Pandas提供的各类函数来进行数据处理。常用的数据处理函数包括排序、筛选、统计等。 例如,对于一个DataFrame类型的数据,Pandas提供了sort_values()函数来对数据进行排序,filter()函数来进行筛选,和describe()函数来进行统计。 4. 导出数据。经过数据处理后,需要将数据导出保存为Excel格式。可以使用Pandas的to_excel()函数将DataFrame写入Excel文件中,其语法格式如下: df.to_excel('文件名.xlsx', sheet_name='工作表名') 总之,PandasPython数据处理中的一个重要工具,它提高了数据处理效率,让我们能够更快捷地进行各种数据操作,通过Pandas可以实现Python实现Excel数据的处理、自动化处理等操作,提高了数据处理效率和准确性,是目前数据处理非常重要的工具之一。 ### 回答3: Python有着强大的数据处理pandas,它可以轻松地处理Excel文件。 Pandas可以导入Excel文件并读取其中的数据。使用pandas的read_excel函数,我们可以打开并读取Excel文件中的数据,将其存储在pandas的DataFrame中。同时,我们还可以对DataFrame进行各种各样的操作。 下面是一些pandas处理Excel文件常用的操作: 1. 读取Excel文件。读取Excel文件可以使用pandas的read_excel函数。例如:df = pandas.read_excel('filename.xlsx', sheet_name='Sheet1'),其中filename是文件名,Sheet1是要读取的工作表的名称。 2. 查看数据。可以使用head()和tail()方法查看DataFrame的前几行和后几行数据,info()方法可以查看DataFrame的信息。 3. 选择数据。pandas的loc和iloc方法可以选择不同行列的数据。例如:df.loc[1:3, ['column1', 'column2']]可以选择行1到行3、列column1和column2的数据。df.iloc[0:2,0:2]可以选择前两行和前两列的数据。 4. 过滤数据。使用条件语句可以过滤数据。例如:df[df['column'] > 10]可以选择列column中大于10的数据。 5. 更新数据。使用loc方法可更新指定位置的数据。例如:df.loc[2, 'column1'] = 15可以将第2行的column1值更新为15。 6. 排序数据。使用sort_values方法可以按指定列的值对数据进行排序。例如:df.sort_values(by='column1')可以按column1列的值升序排列。 7. 合并数据。使用concat和merge方法可以合并多个DataFrame。例如:new_df = pd.concat([df1, df2])将df1和df2合并到新的DataFrame中。 总之,pandas提供了很多方便的方法和函数,能够轻松地处理Excel文件中的数据。无论是数据的读取、选择、过滤、更新、排序还是合并,pandas都能帮助我们高效地完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

名本无名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值