Pandas pd.read_excel() 函数
read_excel() 是 pandas 库中用于读取 Excel 文件的函数,支持读取 .xlsx 和 .xls 格式的 Excel 文件。
Excel 是企业数据分析中最常用的文件格式,它支持多个工作表、丰富的单元格格式、公式等。read_excel() 能够读取 Excel 文件中的数据,并将其转换为 pandas 的 DataFrame 格式,方便后续的数据处理和分析。
基本语法与参数
语法格式
pandas.read_excel(io, sheet_name=0, header=0, names=None, index_col=None,
usecols=None, dtype=None, skiprows=None, nrows=None,
na_values=None, ...)
参数说明
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| io | str, ExcelFile, path object, file-like object | Excel 文件路径或 ExcelFile 对象 | 必填 |
| sheet_name | str, int, list, None | 要读取的工作表名称或索引,None 读取所有工作表 | 0 |
| header | int, list of int | 用作列名的行号,0 表示第一行 | 0 |
| names | list-like | 自定义列名列表 | None |
| index_col | int, str | 用作行索引的列 | None |
| usecols | int, str, list | 只读取指定的列 | None |
| dtype | dict | 指定列的数据类型 | None |
| skiprows | list-like, int | 跳过指定的行 | None |
| nrows | int | 只读取前 n 行 | None |
返回值
- 返回类型:
pd.DataFrame或dictof DataFrames - 当
sheet_name是单个工作表时,返回一个 DataFrame。 - 当
sheet_name是 None 或包含多个工作表时,返回一个字典,键是工作表名,值是对应的 DataFrame。
实例
通过以下示例,全面掌握 read_excel() 的各种用法。
示例 1:读取本地 Excel 文件
首先创建并读取一个简单的 Excel 文件。
实例
import pandas as pd
import openpyxl # 需要安装: pip install openpyxl
# 创建一个 DataFrame
data = {
'name': ['Tom', 'Jerry', 'Mike', 'Lucy'],
'age': [28, 35, 42, 26],
'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen'],
'salary': [8000, 12000, 15000, 7000]
}
df_original = pd.DataFrame(data)
# 将 DataFrame 写入 Excel 文件
# Excel 文件路径: employees.xlsx
df_original.to_excel('employees.xlsx', index=False, engine='openpyxl')
# 使用 read_excel 读取 Excel 文件
# io: 文件路径(必填)
df = pd.read_excel('employees.xlsx')
# 查看读取结果
print("读取的 DataFrame:")
print(df)
print("n数据类型:")
print(df.dtypes)
import openpyxl # 需要安装: pip install openpyxl
# 创建一个 DataFrame
data = {
'name': ['Tom', 'Jerry', 'Mike', 'Lucy'],
'age': [28, 35, 42, 26],
'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen'],
'salary': [8000, 12000, 15000, 7000]
}
df_original = pd.DataFrame(data)
# 将 DataFrame 写入 Excel 文件
# Excel 文件路径: employees.xlsx
df_original.to_excel('employees.xlsx', index=False, engine='openpyxl')
# 使用 read_excel 读取 Excel 文件
# io: 文件路径(必填)
df = pd.read_excel('employees.xlsx')
# 查看读取结果
print("读取的 DataFrame:")
print(df)
print("n数据类型:")
print(df.dtypes)
运行结果预期:
读取的 DataFrame:
name age city salary
0 Tom 28 Beijing 8000
1 Jerry 35 Shanghai 12000
2 Mike 42 Guangzhou 15000
3 Lucy 26 Shenzhen 7000
数据类型:
name object
age int64
city object
salary int64
代码解析:
pd.read_excel('employees.xlsx')是最基本的用法,直接传入文件路径即可。- 默认情况下,读取第一个工作表(sheet_name=0),第一行作为列名。
- 需要安装
openpyxl库来支持 .xlsx 格式的读写。
示例 2:读取多个工作表
Excel 文件可以包含多个工作表,read_excel() 支持灵活读取指定工作表或全部工作表。
h2 class="example">实例
import pandas as pd
# 创建包含多个工作表的 Excel 文件
# 先创建两个 DataFrame
df_sales = pd.DataFrame({
'product': ['A', 'B', 'C', 'D'],
'quantity': [100, 200, 150, 80],
'price': [50, 30, 40, 60]
})
df_inventory = pd.DataFrame({
'product': ['A', 'B', 'C', 'D'],
'stock': [500, 300, 400, 200],
'warehouse': ['WH1', 'WH2', 'WH1', 'WH3']
})
# 写入多个工作表到一个 Excel 文件
with pd.ExcelWriter('multi_sheet.xlsx', engine='openpyxl') as writer:
df_sales.to_excel(writer, sheet_name='Sales', index=False)
df_inventory.to_excel(writer, sheet_name='Inventory', index=False)
# 示例 2a: 读取指定工作表(按名称)
df_sales_read = pd.read_excel('multi_sheet.xlsx', sheet_name='Sales')
print("读取 Sales 工作表:")
print(df_sales_read)
print()
# 示例 2b: 读取指定工作表(按索引)
df_inv_read = pd.read_excel('multi_sheet.xlsx', sheet_name=1)
print("读取第2个工作表 (索引为1):")
print(df_inv_read)
print()
# 示例 2c: 读取所有工作表(返回字典)
all_sheets = pd.read_excel('multi_sheet.xlsx', sheet_name=None)
print("所有工作表名称:", list(all_sheets.keys()))
print("n遍历所有工作表:")
for sheet_name, df_sheet in all_sheets.items():
print(f"n--- {sheet_name} ---")
print(df_sheet)
# 创建包含多个工作表的 Excel 文件
# 先创建两个 DataFrame
df_sales = pd.DataFrame({
'product': ['A', 'B', 'C', 'D'],
'quantity': [100, 200, 150, 80],
'price': [50, 30, 40, 60]
})
df_inventory = pd.DataFrame({
'product': ['A', 'B', 'C', 'D'],
'stock': [500, 300, 400, 200],
'warehouse': ['WH1', 'WH2', 'WH1', 'WH3']
})
# 写入多个工作表到一个 Excel 文件
with pd.ExcelWriter('multi_sheet.xlsx', engine='openpyxl') as writer:
df_sales.to_excel(writer, sheet_name='Sales', index=False)
df_inventory.to_excel(writer, sheet_name='Inventory', index=False)
# 示例 2a: 读取指定工作表(按名称)
df_sales_read = pd.read_excel('multi_sheet.xlsx', sheet_name='Sales')
print("读取 Sales 工作表:")
print(df_sales_read)
print()
# 示例 2b: 读取指定工作表(按索引)
df_inv_read = pd.read_excel('multi_sheet.xlsx', sheet_name=1)
print("读取第2个工作表 (索引为1):")
print(df_inv_read)
print()
# 示例 2c: 读取所有工作表(返回字典)
all_sheets = pd.read_excel('multi_sheet.xlsx', sheet_name=None)
print("所有工作表名称:", list(all_sheets.keys()))
print("n遍历所有工作表:")
for sheet_name, df_sheet in all_sheets.items():
print(f"n--- {sheet_name} ---")
print(df_sheet)
运行结果预期:
读取 Sales 工作表: product quantity price 0 A 100 50 1 B 200 30 2 C 150 40 3 D 80 60 读取第2个工作表 (索引为1): product stock warehouse 0 A 500 WH1 1 B 300 WA2 2 C 400 WH1 3 D 200 WH3 所有工作表名称: ['Sales', 'Inventory'] 遍历所有工作表: --- Sales --- product quantity price ... --- Inventory --- product stock warehouse ...
代码解析:
sheet_name参数可以接受工作表名称(字符串)或索引(整数)。- 设置
sheet_name=None会读取所有工作表,返回一个字典,键是工作表名,值是 DataFrame。 - 使用
pd.ExcelWriter可以方便地写入多个工作表。
示例 3:高级用法 - 自定义列和跳过行
在实际工作中,Excel 文件可能有复杂的格式,需要灵活处理。
实例
import pandas as pd
# 创建一个带有标题行和空行的 Excel 文件
# 前几行是元数据,实际数据从第4行开始
data_with_header = """公司员工数据
创建日期: 2024-01-01
部门: 技术部
---
name,age,city,salary
Tom,28,Beijing,8000
Jerry,35,Shanghai,12000
"""
# 先创建一个 CSV 然后转换为 Excel(模拟真实场景)
import io
df_temp = pd.read_csv(io.StringIO(data_with_header.split('---')[1]))
df_temp.to_excel('complex_format.xlsx', index=False, engine='openpyxl')
# 示例 3a: 跳过前几行,使用第N行作为列名
df_skip = pd.read_excel('complex_format.xlsx', header=3)
print("跳过前3行,使用第4行作为列名:")
print(df_skip)
print()
# 示例 3b: 只读取指定的列
df_cols = pd.read_excel('complex_format.xlsx', usecols=['name', 'salary'])
print("只读取 name 和 salary 列:")
print(df_cols)
print()
# 示例 3c: 只读取前几行
df_head = pd.read_excel('complex_format.xlsx', nrows=2)
print("只读取前2行:")
print(df_head)
print()
# 示例 3d: 自定义列名
df_custom_names = pd.read_excel('complex_format.xlsx',
names=['姓名', '年龄', '城市', '薪资'],
header=0)
print("自定义列名:")
print(df_custom_names)
# 创建一个带有标题行和空行的 Excel 文件
# 前几行是元数据,实际数据从第4行开始
data_with_header = """公司员工数据
创建日期: 2024-01-01
部门: 技术部
---
name,age,city,salary
Tom,28,Beijing,8000
Jerry,35,Shanghai,12000
"""
# 先创建一个 CSV 然后转换为 Excel(模拟真实场景)
import io
df_temp = pd.read_csv(io.StringIO(data_with_header.split('---')[1]))
df_temp.to_excel('complex_format.xlsx', index=False, engine='openpyxl')
# 示例 3a: 跳过前几行,使用第N行作为列名
df_skip = pd.read_excel('complex_format.xlsx', header=3)
print("跳过前3行,使用第4行作为列名:")
print(df_skip)
print()
# 示例 3b: 只读取指定的列
df_cols = pd.read_excel('complex_format.xlsx', usecols=['name', 'salary'])
print("只读取 name 和 salary 列:")
print(df_cols)
print()
# 示例 3c: 只读取前几行
df_head = pd.read_excel('complex_format.xlsx', nrows=2)
print("只读取前2行:")
print(df_head)
print()
# 示例 3d: 自定义列名
df_custom_names = pd.read_excel('complex_format.xlsx',
names=['姓名', '年龄', '城市', '薪资'],
header=0)
print("自定义列名:")
print(df_custom_names)
运行结果预期:
跳过前3行,使用第4行作为列名:
name age city salary
0 Tom 28 Beijing 8000
1 Jerry 35 Shanghai 12000
只读取 name 和 salary 列:
name salary
0 Tom 8000
1 Jerry 12000
只读取前2行:
name age city salary
0 Tom 28 Beijing 8000
自定义列名:
姓名 年龄 城市 薪资
0 Tom 28 Beijing 8000
1 Jerry 35 Shanghai 12000
代码解析:
header参数指定使用第几行作为列名(从0开始计数)。usecols可以指定只读取哪些列,支持列名列表或列索引。nrows限制读取的行数,适合大文件的部分读取。names参数可以自定义列名,会覆盖原文件中的列名。
注意事项
- 读取 .xlsx 格式需要安装
openpyxl:pip install openpyxl。 - 读取 .xls 格式需要安装
xlrd:pip install xlrd(注意:xlrd 2.0+ 版本不再支持 .xls 文件)。 - Excel 文件有行数和列数限制(最多 1048576 行、16384 列),超出限制会导致数据丢失。
- 读取大文件时,可以考虑使用
usecols参数只读取需要的列,提高性能。 sheet_name参数支持混合使用名称和索引。
小结
read_excel() 是 pandas 中读取 Excel 文件的核心函数,功能非常强大。它支持读取单个或多个工作表,可以灵活处理各种格式的 Excel 文件。
在实际数据分析工作中,Excel 文件是最常见的数据来源之一。熟练掌握 read_excel() 的各种参数用法,可以高效地处理各种 Excel 数据,为后续的数据清洗和分析做好准备。建议读者多加练习,特别是多工作表的读取和参数配置。

Pandas 常用函数