Pandas 读取Excel文件

Excel 文件是数据分析中非常常见的数据源。Pandas 的 read_excel() 函数可以读取 .xlsx.xls 等格式,并支持多工作表、指定数据类型等高级功能。

📦 安装依赖库

读取 Excel 文件需要额外的引擎支持,首次使用前请安装以下库:

# 对于 .xlsx 文件(推荐)
pip install openpyxl

# 对于旧版 .xls 文件
pip install xlrd

安装后,Pandas 会自动选择合适的引擎。

📂 基本用法

import pandas as pd

# 读取第一个工作表
df = pd.read_excel('data.xlsx')
print(df.head())

# 也可以指定工作表名
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')

⚙️ 常用参数详解

read_excel() 提供了丰富的参数,与 read_csv() 类似,但增加了工作表相关的选项。

sheet_name

指定要读取的工作表。可以是工作表名称(字符串)、位置索引(从0开始)或工作表名称列表。

pd.read_excel('data.xlsx', sheet_name=0)       # 第一个工作表
pd.read_excel('data.xlsx', sheet_name='Sheet2') # 名为Sheet2的工作表
pd.read_excel('data.xlsx', sheet_name=[0, 'Sheet3']) # 返回字典,键为工作表名
header

指定作为列名的行号(从0开始)。默认为0(第一行)。若数据无表头,设置 header=None,并用 names 指定列名。

pd.read_excel('data.xlsx', header=None, names=['A','B','C'])
names

自定义列名,需配合 header=None 使用或用于替换原有列名。

pd.read_excel('data.xlsx', names=['ID','Name','Age'])
index_col

指定某列作为行索引。可以是列号(整数)或列名(字符串)。

pd.read_excel('data.xlsx', index_col=0)
usecols

指定要读取的列。可以是列号列表、列名列表,或Excel列范围字符串如 "A:C"

pd.read_excel('data.xlsx', usecols=[0, 2])
pd.read_excel('data.xlsx', usecols=['Name','Age'])
pd.read_excel('data.xlsx', usecols="A:C")
dtype

为列指定数据类型,避免自动推断错误。

pd.read_excel('data.xlsx', dtype={'ID': str, 'Salary': float})
skiprows

跳过指定行数或行号列表。

pd.read_excel('data.xlsx', skiprows=2)      # 跳过前两行
pd.read_excel('data.xlsx', skiprows=[0,2])   # 跳过第1行和第3行
nrows

只读取前 n 行,适用于快速预览。

pd.read_excel('data.xlsx', nrows=100)
na_values

指定额外的缺失值标记。

pd.read_excel('data.xlsx', na_values=['NA', 'NULL', '-'])
converters

对指定列应用自定义转换函数。

pd.read_excel('data.xlsx', converters={'Age': lambda x: int(x)})
parse_dates

将指定的列解析为日期类型。

pd.read_excel('data.xlsx', parse_dates=['Birthday'])
engine

手动指定引擎:'openpyxl'(.xlsx)、'xlrd'(.xls)、'odf'(.ods)等。

pd.read_excel('data.xls', engine='xlrd')

📑 多工作表读取

sheet_name 参数传入列表或为 None 时,返回一个包含多个DataFrame的字典,键为工作表名。

# 读取所有工作表
sheets = pd.read_excel('data.xlsx', sheet_name=None)  # 返回字典
print(sheets.keys())  # 所有工作表名

# 读取指定几个工作表
sheets = pd.read_excel('data.xlsx', sheet_name=['Sheet1', 'Sheet3'])
df_sheet1 = sheets['Sheet1']

🧪 综合示例

假设我们有一个 sales.xlsx 文件,包含两个工作表:

  • 2023 列:日期产品销售额
  • 2024 列:日期产品销售额备注
import pandas as pd

# 1. 读取2023工作表,指定日期列解析为日期,产品列作为行索引
df2023 = pd.read_excel('sales.xlsx', sheet_name='2023',
                       parse_dates=['日期'], index_col='产品')
print(df2023.head())

# 2. 读取2024工作表,只读取产品、销售额两列,并将备注中的'NULL'视为缺失
df2024 = pd.read_excel('sales.xlsx', sheet_name='2024',
                       usecols=['产品', '销售额', '备注'],
                       na_values={'备注': ['NULL', '']})
print(df2024.info())

# 3. 读取所有工作表,并查看每个工作表的形状
all_sheets = pd.read_excel('sales.xlsx', sheet_name=None)
for name, df in all_sheets.items():
    print(f"{name}: {df.shape}")

⚠️ 常见问题及解决方法

缺少引擎:出现 ImportError 提示缺少 openpyxlxlrd 时,按上文安装对应库即可。
日期解析失败:确保 Excel 中的日期格式是 Pandas 可识别的,或使用 converters 自定义解析。
内存过大:对于大型 Excel 文件,可以考虑只读取必要列(usecols),或使用 nrows 限制行数。
合并单元格:Pandas 读取时会填充合并单元格(左上角有值,其余为NaN),如需特殊处理,可在读取后使用 fillna(method='ffill') 等方式处理。
提示:读取后建议立即检查数据类型是否正确,特别是日期和数值列。若需保留原始格式,可以使用 dtype=str 先读取所有列为字符串,再按需转换。