50_Pandas读取 Excel 文件 (xlsx, xls)

50_Pandas读取 Excel 文件 (xlsx, xls)

要使用 pandas 将 Excel 文件(扩展名:.xlsx、.xls)作为 pandas.DataFrame 读取,请使用 pandas.read_excel () 函数。

这里,将描述以下内容。

以下面的 xlsx 文件为例。

sheet1

        A   B   C
one     11  12  13
two     21  22  23
three   31  32  33

sheet2

        AA  BB  CC
ONE     11  12  13
TWO     21  22  23
THREE   31  32  33

openpyxl、xlrd的安装

pandas.read_excel () 在内部使用名为 openpyxl 和 xlrd 的库。

openpyxl 和 xlrd 是在 Python 中读取和写入 Excel 文件(.xlsx、.xls)的库。

openpyxl 和 xlrd 都可以用 pip 安装。

$ pip install openpyxl
$ pip install xlrd

pandas.read_excel()的基本用法

在第一个参数 io 中指定 Excel 文件的路径或 URL。 如果您有多个工作表,则只有第一个工作表将作为 pandas.DataFrame 加载。

import pandas as pd

print(pd.__version__)
# 1.2.2

df = pd.read_excel('./data/sample.xlsx', index_col=0)
print(df)
#         A   B   C
# one    11  12  13
# two    21  22  23
# three  31  32  33

print(type(df))
# <class 'pandas.core.frame.DataFrame'>

Index_col = 0 设置为使第一列索引。稍后将描述细节。 该示例读取 .xlsx 文件(Excel2007 之后的 Excel 文件),但同样适用于 .xls 文件(Excel97-2003 的 Excel 文件)。

通过编号/工作表名称指定要读取的工作表:参数 sheet_name

读取一张Sheet

要读取的工作表可以由参数 sheet_name 指定。通过以 0 开头的数字或工作表名称指定。

df_sheet_index = pd.read_excel('./data/sample.xlsx', sheet_name=0, index_col=0)
print(df_sheet_index)
#         A   B   C
# one    11  12  13
# two    21  22  23
# three  31  32  33

df_sheet_name = pd.read_excel('./data/sample.xlsx', sheet_name='sheet2', index_col=0)
print(df_sheet_name)
#        AA  BB  CC
# ONE    11  12  13
# TWO    21  22  23
# THREE  31  32  33

读取多张Sheet

也可以在参数 sheet_name 中指定一个列表。您可以使用起始编号或工作表名称。 指定的数字或工作表名称被读取为键 key,该工作表的数据 pandas.DataFrame 被读取为值为 value 的字典 dict。

df_sheet_multi = pd.read_excel('./data/sample.xlsx', sheet_name=[0, 'sheet2'], index_col=0)
print(type(df_sheet_multi))
# <class 'dict'>

print(len(df_sheet_multi))
# 2

print(df_sheet_multi.keys())
# dict_keys([0, 'sheet2'])

读取时由数字指定的工作表的键是数字,由工作表名称指定的工作表的键是工作表名称。

print(df_sheet_multi[0])
#         A   B   C
# one    11  12  13
# two    21  22  23
# three  31  32  33

print(type(df_sheet_multi[0]))
# <class 'pandas.core.frame.DataFrame'>

print(df_sheet_multi['sheet2'])
#        AA  BB  CC
# ONE    11  12  13
# TWO    21  22  23
# THREE  31  32  33

print(type(df_sheet_multi['sheet2']))
# <class 'pandas.core.frame.DataFrame'>

加载所有Sheet

如果设置了参数 sheet_name = None,则将读取所有工作表。

df_sheet_all = pd.read_excel('./data/sample.xlsx', sheet_name=None, index_col=0)
print(type(df_sheet_all))
# <class 'dict'>

print(df_sheet_all.keys())
# dict_keys(['sheet1', 'sheet2'])

指定标头、索引:参数header、index_col

要指定用作标题(pandas.DataFrame 的列名列)和索引(pandas.DataFrame 的行名索引)的行或列,请将行号/列号以 0 开头分别传递给参数 header 和 index_col。

如果 header 和 index_col 设置为 None,特定的行和列将不会用于 headers 和索引,它们将是从 0 开始的序列号。

df_header_index = pd.read_excel('./data/sample.xlsx', header=None, index_col=None)
print(df_header_index)
#        0   1   2   3
# 0    NaN   A   B   C
# 1    one  11  12  13
# 2    two  21  22  23
# 3  three  31  32  33

print(df_header_index.columns)
# Int64Index([0, 1, 2, 3], dtype='int64')

print(df_header_index.index)
# RangeIndex(start=0, stop=4, step=1)

默认为 header = 0(= 第一行是列),index_col = None(= 没有指定列作为索引)。

df_default = pd.read_excel('./data/sample.xlsx')
print(df_default)
#   Unnamed: 0   A   B   C
# 0        one  11  12  13
# 1        two  21  22  23
# 2      three  31  32  33

print(df_default.columns)
# Index(['Unnamed: 0', 'A', 'B', 'C'], dtype='object')

print(df_default.index)
# RangeIndex(start=0, stop=3, step=1)

如果pandas的版本比较旧,如果header中指定的行的第一个元素是NaN,即使默认也使用第一列作为索引(index_col = None)(源码未确认,所以不知道是什么类型的)处理它是。)。 如果要将第一列设置为索引,可以显式设置 index_col = 0 ,任何版本都可以放心。

print(pd.read_excel('./data/sample.xlsx', index_col=0))
#         A   B   C
# one    11  12  13
# two    21  22  23
# three  31  32  33

也可以在参数名称中指定任何列名称列,如在读取 csv 文件的 read_csv () 中。有关详细信息,请参阅以下文章。

指定要读取的列和不读取的行:参数 usecols、skirows、skipfooter

如果不需要读取所有行/列,您可以指定读取哪些列和不读取哪些行。

在参数 usecols 中传递要读取的列号列表,在参数 skiprows 中传递要跳过(未读取)的行号列表,在参数 skipfooter 中传递要跳过(未读取)的最后行数。

df_use_skip = pd.read_excel('./data/sample.xlsx', index_col=0,
                            usecols=[0, 1, 3], skiprows=[1], skipfooter=1)
print(df_use_skip)
#       A   C
# two  21  23

当然,也可以在读取时不处理行列,全部读取后删除行列或引用任意位置的元素。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年3月10日
下一篇 2023年3月10日

相关推荐