Pandas 读取 Excel:从入门到精通 – wiki大全

Pandas 读取 Excel:从入门到精通

Microsoft Excel 电子表格因其易用性而成为数据存储和共享的常用工具。然而,当需要进行复杂的数据分析、清洗或转换时,纯粹依赖 Excel 往往会力不从心。Python 中的 pandas 库是处理表格数据的强大工具,它提供了高效、灵活的方法来读取、操作和分析 Excel 文件。本文将带您从 pandas 读取 Excel 的基本操作入手,逐步深入到高级技巧和最佳实践,助您精通此项技能。

1. 为什么选择 Pandas 读取 Excel?

pandas 构建于 NumPy 之上,专为数据分析设计。它引入了 DataFrameSeries 两种核心数据结构,能够高效地处理结构化数据。相较于 Excel 自身的功能,pandas 在以下方面具有显著优势:

  • 自动化与重复性:通过编写脚本,您可以自动化重复性的数据导入和清洗任务。
  • 处理大数据量pandas 能够处理 Excel 难以应对的巨量数据。
  • 强大的数据操作:提供丰富的数据清洗、转换、合并、聚合功能。
  • 集成性:可以与其他 Python 库(如 matplotlib, seaborn 用于可视化,scikit-learn 用于机器学习)无缝集成。

2. 环境准备

在开始之前,请确保您的 Python 环境中安装了 pandasopenpyxl(或 xlrd,但 openpyxl 是推荐的现代引擎,支持 .xlsx 格式)。

bash
pip install pandas openpyxl

3. 入门:基本读取操作 (pd.read_excel())

pd.read_excel()pandas 读取 Excel 文件的核心函数。最简单的用法是直接传入文件路径:

“`python
import pandas as pd

假设您的文件名为 ‘sample_data.xlsx’

df = pd.read_excel(‘sample_data.xlsx’)
print(df.head()) # 查看前5行数据
“`

3.1 指定工作表 (Sheet)

一个 Excel 文件通常包含多个工作表。您可以通过工作表的名称或索引来指定要读取的表。

  • 按名称指定
    python
    # 读取名为 'Sheet1' 的工作表
    df_sheet1 = pd.read_excel('sample_data.xlsx', sheet_name='Sheet1')
    print(df_sheet1.head())

  • 按索引指定(0 代表第一个工作表,1 代表第二个,以此类推):
    python
    # 读取第一个工作表 (索引为 0)
    df_first_sheet = pd.read_excel('sample_data.xlsx', sheet_name=0)
    print(df_first_sheet.head())

3.2 处理表头 (header)

默认情况下,pd.read_excel() 会将 Excel 文件的第一行作为 DataFrame 的列名(即 header=0)。

  • 如果数据没有表头
    python
    # 不使用任何行作为表头,pandas 会自动生成数字列名 (0, 1, 2...)
    df_no_header = pd.read_excel('sample_data.xlsx', header=None)
    print(df_no_header.head())

  • 表头在其他行
    python
    # 如果表头在第二行 (索引为 1)
    df_header_row = pd.read_excel('sample_data.xlsx', header=1)
    print(df_header_row.head())

3.3 指定索引列 (index_col)

如果您希望将某一列作为 DataFrame 的行索引,可以使用 index_col 参数。

“`python

将第一列 (索引为 0) 作为行索引

df_with_index = pd.read_excel(‘sample_data.xlsx’, index_col=0)
print(df_with_index.head())
“`

4. 进阶:灵活控制读取行为

pd.read_excel() 提供了丰富的参数,让您能够精确控制数据导入过程。

4.1 跳过行和限制读取行数 (skiprows, nrows)

  • 跳过指定行数
    python
    # 跳过文件的前两行 (如包含文件说明等无关信息)
    df_skip_rows = pd.read_excel('sample_data.xlsx', skiprows=2)
    print(df_skip_rows.head())

  • 限制读取行数
    python
    # 只读取数据的前 10 行
    df_n_rows = pd.read_excel('sample_data.xlsx', nrows=10)
    print(df_n_rows)

  • 跳过特定行
    您还可以传递一个行号列表来跳过不连续的行。
    python
    # 跳过第 0、2、4 行
    df_skip_specific = pd.read_excel('sample_data.xlsx', skiprows=[0, 2, 4])
    print(df_skip_specific.head())

4.2 选择特定列 (usecols)

为了避免读取不必要的列,提高效率,可以使用 usecols 参数。

  • 按列名选择
    python
    # 只读取 'Name' 和 'Age' 列
    df_selected_cols_name = pd.read_excel('sample_data.xlsx', usecols=['Name', 'Age'])
    print(df_selected_cols_name.head())

  • 按列索引选择
    python
    # 只读取第一列 (索引 0) 和第三列 (索引 2)
    df_selected_cols_index = pd.read_excel('sample_data.xlsx', usecols=[0, 2])
    print(df_selected_cols_index.head())

  • 按列范围选择
    python
    # 读取从 'A' 到 'C' 的所有列
    df_col_range = pd.read_excel('sample_data.xlsx', usecols='A:C')
    print(df_col_range.head())

4.3 指定数据类型 (dtype)

Excel 在保存数据时可能会丢失原始数据类型信息,或者将数字存储为文本。使用 dtype 可以强制指定列的数据类型,避免后续操作出现问题。

“`python

强制 ‘ID’ 列为整数,’Value’ 列为浮点数

df_with_dtype = pd.read_excel(‘sample_data.xlsx’, dtype={‘ID’: int, ‘Value’: float})
print(df_with_dtype.info()) # 检查数据类型
“`

4.4 处理缺失值 (na_values)

Excel 中可能用 N/A- 或空字符串表示缺失值。pandas 默认能识别一些常见的缺失值表示(如 NaN, null, None),但您可以使用 na_values 指定额外的缺失值标识。

“`python

将 Excel 中的 ‘N/A’ 和 ‘-‘ 识别为缺失值

df_na_values = pd.read_excel(‘sample_data.xlsx’, na_values=[‘N/A’, ‘-‘])
print(df_na_values)
“`

4.5 解析日期 (parse_dates)

如果 Excel 中的日期列被读取为字符串或数字,您可以使用 parse_dates 将其正确解析为 datetime 对象。

“`python

将 ‘Date’ 列解析为日期时间对象

df_dates = pd.read_excel(‘sample_data.xlsx’, parse_dates=[‘Date’])
print(df_dates.info())
“`

5. 处理多工作表文件

当一个 Excel 文件包含多个工作表,且您需要同时处理它们时,pd.read_excel() 也能轻松应对。

  • 读取所有工作表
    sheet_name 参数设置为 Nonepd.read_excel() 将返回一个字典,其键是工作表名称,值是对应的 DataFrame
    “`python
    all_sheets = pd.read_excel(‘multiple_sheets.xlsx’, sheet_name=None)

    for sheet_name, df in all_sheets.items():
    print(f”— Sheet: {sheet_name} —“)
    print(df.head())
    print(“\n”)
    “`

  • 读取指定多个工作表
    您可以传入一个工作表名称列表或索引列表。
    “`python
    # 读取 ‘Sheet1’ 和 ‘Sheet3’
    specific_sheets = pd.read_excel(‘multiple_sheets.xlsx’, sheet_name=[‘Sheet1’, ‘Sheet3’])

    for sheet_name, df in specific_sheets.items():
    print(f”— Sheet: {sheet_name} —“)
    print(df.head())
    print(“\n”)
    “`

6. 性能优化与大型文件处理

对于包含数百万行的大型 Excel 文件,直接一次性读取可能会消耗大量内存甚至导致程序崩溃。pandas 提供了分块读取的机制。

“`python

分块读取大型文件,每次读取 10000 行

chunk_size = 10000
chunks = []

for chunk in pd.read_excel(‘large_data.xlsx’, chunksize=chunk_size):
chunks.append(chunk)
# 您可以在这里对每个 chunk 进行处理,例如清洗、筛选等

如果需要,可以将所有 chunks 合并成一个 DataFrame

large_df = pd.concat(chunks, ignore_index=True)
print(large_df.head())
“`

提示:在读取大型文件时,提前指定 dtype 可以显著减少内存占用,因为 pandas 不必猜测每列的最佳数据类型。

7. 错误处理

在使用 pd.read_excel() 时,可能会遇到一些常见错误。

  • FileNotFoundError:文件路径不正确或文件不存在。
    python
    try:
    df = pd.read_excel('non_existent_file.xlsx')
    except FileNotFoundError:
    print("错误:文件未找到。请检查文件路径是否正确。")

  • ValueError:指定的 sheet_nameindex_col 无效。
    python
    try:
    df = pd.read_excel('sample_data.xlsx', sheet_name='NonExistentSheet')
    except ValueError as e:
    print(f"错误:指定的工作表名称无效。详细信息:{e}")

8. 最佳实践与技巧

  • 始终检查数据:读取数据后,立即使用 .head(), .info(), .describe(), .shape 等方法来了解数据的结构、类型和统计摘要,这有助于发现潜在的读取问题。
  • 先清洗再分析:原始 Excel 文件往往不“干净”。利用 pandas 的各种功能(如 dropna(), fillna(), str.strip(), replace() 等)进行数据清洗是至关重要的第一步。
  • 绝对路径与相对路径:对于经常变动工作目录的项目,使用文件的绝对路径可以避免 FileNotFoundError
  • 处理混合类型列:Excel 中的一列可能包含数字和文本。pandas 默认会将其推断为 object 类型。如果需要特定类型,请使用 dtype 参数。
  • 引擎选择read_excel 默认尝试使用 openpyxlxlrd 作为引擎。openpyxl 支持 .xlsx 格式,xlrd 曾广泛用于 .xls.xlsx,但其对 .xlsx 的支持已移除写入功能。如果遇到问题,可以尝试显式指定 engine 参数:pd.read_excel('file.xls', engine='xlrd')

9. 结论

pandasread_excel() 函数是 Python 数据分析工作流中不可或缺的一部分。从简单的文件导入到复杂的多工作表、分块读取,再到细粒度的数据类型和缺失值处理,它提供了全面的功能。掌握这些技巧,您将能够高效、准确地将 Excel 数据转化为 DataFrame,为后续的探索性数据分析、建模和可视化奠定坚实的基础。

滚动至顶部