Pandas 读取 Excel:入门指南 – wiki基地


Pandas 读取 Excel:入门指南

数据是现代世界的基石,而 Excel 文件(.xls.xlsx)无疑是存储和分享结构化数据最常见的格式之一。无论是业务报告、科学实验数据、还是日常记录,我们都可能遇到需要处理 Excel 文件的情况。虽然 Excel 提供了强大的手动操作界面,但在面对大量数据、需要重复性任务或进行复杂分析时,手动操作效率低下且容易出错。

这时,强大的数据分析工具就显得尤为重要。在 Python 生态系统中,Pandas 库凭借其高效的数据结构(DataFrame 和 Series)和丰富的数据处理函数,成为了数据科学和数据分析领域的首选工具。Pandas 与 Excel 的结合,使得自动化地读取、清洗、转换和分析 Excel 数据变得轻而易举。

本篇文章将作为一份详细的入门指南,带领你深入了解如何使用 Pandas 读取 Excel 文件。我们将从最基础的读取操作开始,逐步探索各种常用参数,解决你在实际工作中可能遇到的各种复杂场景,最终让你能够自信地使用 Pandas 处理各种 Excel 数据。

1. 准备工作:安装 Pandas 和必要的依赖库

在开始之前,你需要确保你的 Python 环境已经安装了 Pandas 以及能够读取 Excel 文件的相关库。

  1. 安装 Python: 如果你还没有安装 Python,请访问 python.org 下载并安装最新版本。建议安装 Python 3.6 或更高版本。安装时,请确保勾选 “Add Python to PATH”(或类似的选项),这样你就可以在命令行中直接使用 pythonpip 命令了。

  2. 安装 Pandas: 打开你的终端或命令提示符,运行以下命令:
    bash
    pip install pandas

    这将安装 Pandas 库及其核心依赖项。

  3. 安装 Excel 读取引擎: Pandas 本身并不直接处理 Excel 文件的底层格式解析。它依赖于第三方库来完成这项工作。

    • 对于较新的 .xlsx 文件,你需要安装 openpyxl 库:
      bash
      pip install openpyxl
    • 对于较旧的 .xls 文件(Excel 2003 或更早版本),你需要安装 xlrd 库:
      bash
      pip install xlrd

      在大多数情况下,安装 openpyxl 就足够了,因为 .xlsx 是当前主流的 Excel 格式。如果你不确定,或者需要同时处理新旧格式的文件,可以两个都安装。Pandas 会根据文件扩展名自动选择合适的引擎。

完成以上步骤后,你就可以在 Python 脚本或 Jupyter Notebook 中导入 Pandas 并开始读取 Excel 文件了。

2. 最简单的开始:读取第一个工作表

假设你有一个名为 sales_data.xlsx 的 Excel 文件,其中包含一个名为 Sheet1 的工作表,数据从第一行第一列开始。最基本的读取操作非常简单:

“`python
import pandas as pd

文件路径

file_path = ‘sales_data.xlsx’

读取Excel文件

try:
df = pd.read_excel(file_path)

# 显示前5行数据和列信息,初步检查读取结果
print("成功读取文件:", file_path)
print("\n数据前5行:")
print(df.head())
print("\n数据信息:")
df.info()

except FileNotFoundError:
print(f”错误:文件 ‘{file_path}’ 未找到。请检查文件路径是否正确。”)
except Exception as e:
print(f”读取文件时发生错误:{e}”)
“`

这段代码做了以下几件事:

  1. 导入 Pandas 库,通常别名为 pd
  2. 定义了 Excel 文件的路径。
  3. 使用 pd.read_excel() 函数读取文件。这是 Pandas 中用于读取 Excel 文件的核心函数。
  4. 将读取到的数据存储在一个 Pandas DataFrame 对象 df 中。DataFrame 是 Pandas 中最重要的数据结构,它可以看作是一个带有列名和行索引的表格。
  5. 使用 try...except 块来处理可能的 FileNotFoundError,这是一个良好的编程习惯。
  6. 如果读取成功,打印成功信息,并使用 df.head() 显示 DataFrame 的前 5 行,用 df.info() 显示 DataFrame 的列名、非空值数量以及数据类型,帮助你快速了解读取到的数据结构。

默认行为:

  • pd.read_excel() 在不指定其他参数时,会默认读取 Excel 文件中的第一个工作表
  • 它会默认将工作表的第一行作为 DataFrame 的列名(header)
  • 它会尝试自动推断每列的数据类型(整数、浮点数、字符串、日期等)。
  • 它会为 DataFrame 自动生成一个从 0 开始的整数索引。

这个简单的例子展示了 read_excel 的基本用法,但实际情况往往更复杂。接下来,我们将探索如何使用 read_excel 的各种参数来应对不同的读取需求。

3. 精准控制:read_excel 的常用参数详解

pd.read_excel() 函数提供了丰富的参数,让你能够精细控制读取过程。掌握这些参数是高效处理 Excel 数据的关键。我们将逐一介绍其中最常用的参数。

3.1 指定工作表 (sheet_name)

Excel 文件通常包含多个工作表(sheets)。默认情况下 read_excel 只读取第一个工作表。你可以使用 sheet_name 参数来指定要读取的工作表。

sheet_name 参数可以接受多种类型的值:

  • 整数(从 0 开始): 指定工作表的索引位置。sheet_name=0 表示第一个工作表,sheet_name=1 表示第二个工作表,以此类推。
  • 字符串: 指定工作表的名称。例如 sheet_name='Sheet2'sheet_name='销售数据'
  • 列表(整数或字符串的组合): 读取多个指定的工作表。例如 sheet_name=['Sheet1', 'Summary']sheet_name=[0, 2]。这将返回一个字典,字典的键是工作表名,值是对应工作表的 DataFrame。
  • None: 读取文件中的所有工作表。这也将返回一个字典,键是工作表名,值是对应工作表的 DataFrame。

示例:

“`python
import pandas as pd

file_path = ‘sales_data_multisheet.xlsx’ # 假设这个文件有多个工作表

1. 读取第二个工作表 (索引为 1)

df_sheet2_by_index = pd.read_excel(file_path, sheet_name=1)
print(“\n读取第二个工作表 (通过索引 1):”)
print(df_sheet2_by_index.head())

2. 读取名为 ‘Summary’ 的工作表

df_summary_by_name = pd.read_excel(file_path, sheet_name=’Summary’)
print(“\n读取名为 ‘Summary’ 的工作表:”)
print(df_summary_by_name.head())

3. 读取多个工作表 ‘Sheet1’ 和 ‘Errors’

sheets_dict = pd.read_excel(file_path, sheet_name=[‘Sheet1’, ‘Errors’])
print(“\n读取多个工作表 ‘Sheet1’ 和 ‘Errors’:”)
print(“读取到的工作表字典的键:”, sheets_dict.keys())

访问某个具体的工作表,例如 ‘Sheet1’

df_sheet1_from_dict = sheets_dict[‘Sheet1’]
print(“\n来自字典的 ‘Sheet1’ 数据前5行:”)
print(df_sheet1_from_dict.head())

4. 读取所有工作表

all_sheets_dict = pd.read_excel(file_path, sheet_name=None)
print(“\n读取所有工作表:”)
print(“所有工作表名称:”, all_sheets_dict.keys())
“`

注意:sheet_name 返回一个字典时,每个字典的值都是一个独立的 DataFrame,你可以通过工作表名(即字典的键)来访问它们。

3.2 处理表头 (header)

有时候,Excel 工作表的数据并不是从第一行开始就是表头,或者根本就没有表头。header 参数用来指定哪一行应该作为列名。

header 参数可以接受:

  • 整数: 指定哪一行的索引(从 0 开始)作为表头。例如 header=0 表示第一行是表头(默认行为),header=1 表示第二行是表头。
  • 列表(整数): 如果你的表头跨越多行,你可以指定一个包含多行索引的列表。这将形成一个多级索引(MultiIndex)的列名。
  • None: 表示数据没有表头。Pandas 会自动生成从 0 开始的整数列名(0, 1, 2, …)。

示例:

“`python
import pandas as pd

file_path_header = ‘data_with_complex_header.xlsx’ # 假设文件结构特殊

1. 数据从第三行开始,且第三行是表头 (索引为 2)

df_header_row = pd.read_excel(file_path_header, header=2)
print(“\n指定第三行作为表头 (header=2):”)
print(df_header_row.head())
print(df_header_row.columns) # 查看列名

2. 数据没有表头

假设文件第一行就是数据,没有列名

df_no_header = pd.read_excel(‘data_no_header.xlsx’, header=None)
print(“\n数据没有表头 (header=None):”)
print(df_no_header.head())
print(df_no_header.columns) # 查看自动生成的列名
“`

当你指定 header=None 时,后续处理数据时需要通过整数索引来访问列。

3.3 跳过行或脚注 (skiprows, skipfooter)

有时候,Excel 文件的顶部可能有一些描述性文字、标题或者底部的汇总信息,这些都不是实际的数据,需要在读取时跳过。

  • skiprows: 指定要跳过的行数(从文件开头算起),或者是一个包含要跳过的具体行号(从 0 开始)的列表。
  • skipfooter: 指定要跳过的行数(从文件末尾算起)。

示例:

“`python
import pandas as pd

file_path_skip = ‘report_with_notes.xlsx’ # 假设文件有顶部说明和底部汇总

1. 跳过文件开头的 5 行

df_skip_top = pd.read_excel(file_path_skip, skiprows=5)
print(“\n跳过开头的 5 行 (skiprows=5):”)
print(df_skip_top.head())

2. 跳过文件末尾的 3 行 (例如汇总信息)

注意:skiprows和skipfooter可以同时使用

df_skip_footer = pd.read_excel(file_path_skip, skiprows=5, skipfooter=3)
print(“\n跳过末尾的 3 行 (skipfooter=3):”)
print(df_skip_footer.tail()) # 查看数据尾部,确认脚注已被跳过

3. 跳过指定的某些行 (例如行号 0, 1, 4 – 从0开始计数)

假设原始文件第一行、第二行和第五行是不需要的

df_skip_specific = pd.read_excel(‘data_with_junk_rows.xlsx’, skiprows=[0, 1, 4])
print(“\n跳过指定的某些行 (skiprows=[0, 1, 4]):”)
print(df_skip_specific.head())
“`

skiprowsskipfooter 在处理带有额外信息的报表类 Excel 文件时非常有用。

3.4 选择需要的列 (usecols)

如果 Excel 文件包含很多列,但你只需要其中的一部分,使用 usecols 参数可以避免读取不必要的数据,提高效率并减少内存占用。

usecols 参数可以接受多种格式:

  • 列表(整数): 指定要读取的列的索引(从 0 开始)。例如 usecols=[0, 3, 5] 读取第一列、第四列和第六列。
  • 列表(字符串): 指定要读取的列的名称。例如 usecols=['CustomerID', 'ProductName', 'Amount']
  • 字符串: 一个表示列范围的字符串。例如 usecols='A:C' 读取 A, B, C 列;usecols='A,C,E' 读取 A, C, E 列;usecols='A:C,E:F' 读取 A到C 列和 E到F 列。
  • 可调用对象 (Callable): 一个函数,它接受列名(字符串)作为输入,返回 True 如果该列应该被包含,否则返回 False。例如 usecols=lambda x: x.lower().startswith('sales') 读取所有列名以 ‘sales’ 开头的列。

示例:

“`python
import pandas as pd

file_path_cols = ‘large_sales_data.xlsx’ # 假设文件有很多列

1. 按列索引选择列 (读取第 0, 2, 4 列)

df_usecols_index = pd.read_excel(file_path_cols, usecols=[0, 2, 4])
print(“\n按列索引选择列 (usecols=[0, 2, 4]):”)
print(df_usecols_index.head())
print(df_usecols_index.columns)

2. 按列名选择列 (读取 ‘订单编号’, ‘商品名称’, ‘总金额’ 列)

df_usecols_names = pd.read_excel(file_path_cols, usecols=[‘订单编号’, ‘商品名称’, ‘总金额’])
print(“\n按列名选择列 (usecols=[‘订单编号’, ‘商品名称’, ‘总金额’]):”)
print(df_usecols_names.head())
print(df_usecols_names.columns)

3. 按列字母范围选择列 (读取 A 到 C 列)

df_usecols_range = pd.read_excel(file_path_cols, usecols=’A:C’)
print(“\n按列字母范围选择列 (usecols=’A:C’):”)
print(df_usecols_range.head())
print(df_usecols_range.columns)

4. 使用可调用对象选择列 (选择所有列名中包含 ‘日期’ 的列)

df_usecols_callable = pd.read_excel(file_path_cols, usecols=lambda col: ‘日期’ in col)
print(“\n使用可调用对象选择列 (选择列名包含 ‘日期’ 的列):”)
print(df_usecols_callable.head())
print(df_usecols_callable.columns)
“`

usecols 是一个非常强大的参数,特别是在处理宽表格时。

3.5 处理缺失值 (na_values, keep_default_na)

Excel 文件中的缺失值可能以各种形式表示,比如空白单元格、特定的字符串(如 “N/A”, “-“, “未知”)或者特定的标记。Pandas 默认将空白单元格以及一些常见的缺失值表示形式(如 ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’, ‘#NULL!’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’, ”)读取为 NaN(Not a Number),这是 Pandas 表示缺失值的标准方式。

  • na_values: 指定一个值或一个值的列表,这些值在文件中应该被识别为缺失值(NaN)。
  • keep_default_na: 布尔值,默认为 True。如果设置为 False,将禁用 Pandas 默认的缺失值识别,只根据 na_values 参数指定的来识别。

示例:

“`python
import pandas as pd

file_path_na = ‘data_with_missing_values.xlsx’ # 假设文件中缺失值表示为 ‘N/A’, ‘-‘, ‘待定’

1. 除了默认的缺失值表示外,将 ‘待定’ 也识别为缺失值

df_na_custom = pd.read_excel(file_path_na, na_values=[‘待定’])
print(“\n识别 ‘待定’ 为缺失值:”)
print(df_na_custom.head())
print(“\n每列的缺失值数量:”)
print(df_na_custom.isnull().sum())

2. 禁用默认的缺失值识别,只将空白单元格和 ‘-‘ 识别为缺失值

df_na_only_custom = pd.read_excel(file_path_na, na_values=[‘-‘], keep_default_na=False)
print(“\n只识别 ‘-‘ 为缺失值 (禁用默认识别):”)
print(df_na_only_custom.head())
print(“\n每列的缺失值数量 (禁用默认识别):”)
print(df_na_only_custom.isnull().sum())
“`

使用 na_values 可以确保你的数据中各种形式的缺失值都被正确地标记为 NaN,便于后续的数据清洗和处理。

3.6 指定列的数据类型 (dtype)

有时候,Pandas 自动推断的数据类型可能不符合你的需求。例如,一个全是数字但需要保留前导零的列(如邮政编码或ID号)可能会被错误地读取为整数或浮点数,导致前导零丢失。你可以使用 dtype 参数指定每列的数据类型。

dtype 参数接受一个字典,字典的键是列名(字符串),值是 NumPy 的数据类型或 Python 的数据类型。

示例:

“`python
import pandas as pd

file_path_dtype = ‘data_with_ids.xlsx’ # 假设 ‘客户ID’ 列需要保留前导零

假设 ‘客户ID’ 列在Excel中存储为数字,但实际是字符串(如 ‘001’, ‘010’)

默认读取可能会变成 1, 10

1. 指定 ‘客户ID’ 列为字符串类型

df_dtype_string = pd.read_excel(file_path_dtype, dtype={‘客户ID’: str, ‘邮政编码’: str})
print(“\n指定 ‘客户ID’ 和 ‘邮政编码’ 列为字符串类型:”)
print(df_dtype_string.head())
print(df_dtype_string.info()) # 查看数据类型是否正确

2. 指定某个数值列为特定的数值类型 (例如,确保 ‘金额’ 列是浮点数)

即使Excel中有些金额是整数,读取后也会转为浮点数

df_dtype_float = pd.read_excel(file_path_dtype, dtype={‘金额’: float})
print(“\n指定 ‘金额’ 列为浮点数类型:”)
print(df_dtype_float.head())
print(df_dtype_float.info())
“`

使用 dtype 可以避免因数据类型错误导致的问题,尤其是在处理标识符、代码或需要精确数值类型的列时。

3.7 解析日期列 (parse_dates, date_parser, date_format)

日期和时间数据在数据分析中非常常见,但它们的格式多种多样。Excel 存储日期和时间的方式有时比较特殊(以数字形式存储),Pandas 需要明确知道哪些列应该被解析为日期时间类型。

  • parse_dates:

    • 布尔值:True 表示尝试解析索引。False 表示不解析(默认)。
    • 列表(整数或字符串):指定哪些列应该被解析为日期时间类型。例如 parse_dates=['日期']parse_dates=[1]
    • 列表(列表的列表):用于将多个列组合起来解析为一个日期时间列。例如 parse_dates=[['年', '月', '日']]
    • 字典:用于指定要解析的列以及如何将它们组合成新的日期时间列。例如 parse_dates={'日期时间': ['日期', '时间']}
  • date_parser: (较老版本或复杂格式使用)如果 parse_dates 无法正确解析你的日期格式,你可以提供一个函数来完成解析。这个函数会接收原始的日期字符串作为输入,并返回一个 Pandas 可以理解的日期时间对象。通常使用 lambda 函数结合 pd.to_datetimedatetime.strptime 来实现。注意:在较新的 Pandas 版本中,更推荐使用 date_format 参数。

  • date_format: (Pandas 1.3+ 推荐)指定用于解析日期字符串的格式代码(如 ‘%Y-%m-%d’)。这个参数通常与 parse_dates 结合使用。使用格式代码通常比 date_parser 更高效。

示例:

“`python
import pandas as pd

file_path_dates = ‘data_with_dates.xlsx’ # 假设文件有 ‘订单日期’ 和 ‘发货时间’ 列

1. 简单指定日期列 (如果格式是 Pandas 能自动识别的,如 ‘YYYY-MM-DD’)

df_parse_dates_simple = pd.read_excel(file_path_dates, parse_dates=[‘订单日期’])
print(“\n指定 ‘订单日期’ 列为日期类型:”)
print(df_parse_dates_simple.head())
print(df_parse_dates_simple.info()) # 查看 ‘订单日期’ 的数据类型,应为 datetime64[ns]

2. 指定多个日期列

df_parse_dates_multi = pd.read_excel(file_path_dates, parse_dates=[‘订单日期’, ‘发货时间’])
print(“\n指定 ‘订单日期’ 和 ‘发货时间’ 列为日期类型:”)
print(df_parse_dates_multi.head())
print(df_parse_dates_multi.info())

3. 使用 date_format 指定日期格式 (例如,Excel中的日期格式是 ‘DD/MM/YYYY’)

假设 ‘注册日期’ 列的格式是 ‘日/月/年’

df_date_format = pd.read_excel(file_path_dates, parse_dates=[‘注册日期’], date_format=’%d/%m/%Y’)
print(“\n使用 date_format 指定日期格式 (‘日/月/年’):”)
print(df_date_format.head())
print(df_date_format.info())

4. 将多个列合并解析为日期时间列 (假设有 ‘年’, ‘月’, ‘日’ 三列)

假设文件中有 ‘订单年’, ‘订单月’, ‘订单日’ 三列

df_combine_dates = pd.read_excel(‘data_with_date_parts.xlsx’, parse_dates={‘订单日期’: [‘订单年’, ‘订单月’, ‘订单日’]})
print(“\n合并 ‘订单年’, ‘订单月’, ‘订单日’ 列为新的 ‘订单日期’ 列:”)
print(df_combine_dates.head())
print(df_combine_dates.info())
“`

正确解析日期时间数据对于后续的时间序列分析、筛选和聚合操作至关重要。

3.8 指定索引列 (index_col)

默认情况下,Pandas 会为 DataFrame 生成一个从 0 开始的整数索引。但有时,Excel 文件中的某一列本身就适合作为 DataFrame 的索引(例如 ID 列、日期列等)。可以使用 index_col 参数指定哪一列作为索引。

index_col 参数可以接受:

  • 整数: 指定哪一列的索引(从 0 开始)作为索引。
  • 字符串: 指定哪一列的名称作为索引。
  • 列表(整数或字符串): 指定多列作为复合索引(MultiIndex)。
  • False: 不使用任何列作为索引,使用默认的整数索引(这是默认行为)。

示例:

“`python
import pandas as pd

file_path_index = ‘data_with_ids.xlsx’ # 假设 ‘订单编号’ 列适合作为索引

1. 指定 ‘订单编号’ 列作为索引

df_indexed = pd.read_excel(file_path_index, index_col=’订单编号’)
print(“\n指定 ‘订单编号’ 列作为索引:”)
print(df_indexed.head())
print(df_indexed.index) # 查看 DataFrame 的索引

2. 指定第一列 (索引 0) 作为索引

df_indexed_by_pos = pd.read_excel(file_path_index, index_col=0)
print(“\n指定第一列 (索引 0) 作为索引:”)
print(df_indexed_by_pos.head())
print(df_indexed_by_pos.index)
“`

将合适的列设置为索引可以方便地进行基于标签的数据选取和对齐操作。

3.9 限制读取的行数 (nrows)

对于非常大的 Excel 文件,你可能只想读取开头的几行进行快速预览或测试。使用 nrows 参数可以指定要读取的最大行数(不包括表头)。

示例:

“`python
import pandas as pd

file_path_large = ‘very_large_data.xlsx’ # 假设这是一个非常大的文件

只读取前 1000 行数据

df_nrows = pd.read_excel(file_path_large, nrows=1000)
print(“\n只读取前 1000 行:”)
print(df_nrows.head())
print(“读取的总行数 (不含表头):”, len(df_nrows))
“`

nrows 参数对于处理大型文件时的性能优化和快速调试非常有用。

4. 更多高级参数和注意事项

除了上述常用参数外,read_excel 还有一些其他参数,可以处理更特殊的场景:

  • skiprows 可以接受一个可调用对象,用于更灵活地决定哪些行应该被跳过。
  • mangle_dupe_cols: 布尔值,默认为 True。如果列名有重复,Pandas 会默认给重复的列名添加后缀(如 .1, .2)。设置为 False 会保留重复的列名,但这通常会导致问题。
  • engine: 强制指定使用的读取引擎(如 'openpyxl', 'xlrd', 'odf', 'pyxlsb')。通常 Pandas 会自动选择,但在特殊情况下可能需要手动指定。
  • decimal: 指定 Excel 文件中小数点使用的字符,默认为 .
  • thousands: 指定 Excel 文件中千位分隔符使用的字符。

注意事项:

  • 文件路径: 确保提供的文件路径是正确的。可以是绝对路径,也可以是相对于当前工作目录的相对路径。
  • 文件格式: 确保文件是有效的 Excel 文件(.xls.xlsx)。尝试读取其他格式的文件会引发错误。
  • 编码: Excel 文件本身没有明确的文本编码概念(字符串编码通常由操作系统或Excel版本决定)。read_excel 通常能很好地处理常见的 Excel 文件,但在遇到特殊字符或非标准编码时可能会出现乱码。大多数情况下,默认设置是足够的。
  • 内存限制: 读取大型 Excel 文件可能会消耗大量内存。如果遇到内存错误,可以考虑使用 usecols, nrows, dtype 参数来减少读取的数据量,或者使用 chunksize 参数进行分块读取(尽管 read_excel 没有像 read_csv 那样直接的 chunksize 参数,但你可以通过迭代读取不同的 skiprowsnrows 范围来实现类似功能,或者使用更底层的库)。
  • 性能: 对于非常大的文件,读取时间可能会较长。确保安装了合适的引擎 (openpyxl 通常比 xlrd 快,尤其是对于 .xlsx 文件)。

5. 综合示例:读取一个包含多种复杂情况的报表

让我们通过一个更贴近实际的综合示例来巩固所学知识。假设你有一个名为 monthly_report.xlsx 的 Excel 文件,其结构如下:

  • 工作表名称是 2023年销售总览
  • 前 3 行是标题和报告信息,需要跳过。
  • 第 4 行是实际的列头。
  • 数据从第 5 行开始。
  • 报告底部有 2 行汇总和注释,需要跳过。
  • 其中一列名为 订单日期,格式可能是 YYYY/MM/DD
  • 一列名为 客户ID,需要作为字符串读取以保留前导零,并将其设为索引。
  • 一列名为 金额
  • 一列名为 状态,其中 ‘待处理’ 应该被视为缺失值。
  • 你只需要 订单日期, 客户ID, 金额, 状态 这几列。

“`python
import pandas as pd

file_path_complex = ‘monthly_report.xlsx’

try:
df_report = pd.read_excel(
file_path_complex,
sheet_name=’2023年销售总览’, # 1. 指定工作表名称
skiprows=3, # 2. 跳过开头的 3 行
skipfooter=2, # 3. 跳过末尾的 2 行
header=0, # 4. 在跳过行后,将当前的第一行(即原始文件的第 4 行)作为表头
usecols=[‘订单日期’, ‘客户ID’, ‘金额’, ‘状态’], # 5. 选择需要的列
dtype={‘客户ID’: str}, # 6. 指定 ‘客户ID’ 列为字符串
parse_dates=[‘订单日期’], # 7. 将 ‘订单日期’ 列解析为日期
date_format=’%Y/%m/%d’, # 8. 指定 ‘订单日期’ 的格式
na_values=[‘待处理’], # 9. 将 ‘待处理’ 识别为缺失值
index_col=’客户ID’ # 10. 将 ‘客户ID’ 列设为索引
)

print("成功读取复杂报表文件:")
print("\n读取到的数据前5行:")
print(df_report.head())
print("\n读取到的数据信息:")
df_report.info()
print("\n每列的缺失值数量:")
print(df_report.isnull().sum())
print("\nDataFrame 索引:")
print(df_report.index)

except FileNotFoundError:
print(f”错误:文件 ‘{file_path_complex}’ 未找到。”)
except Exception as e:
print(f”读取文件时发生错误:{e}”)
“`

这个例子综合使用了 sheet_name, skiprows, skipfooter, header, usecols, dtype, parse_dates, date_format, na_values, index_col 等多个参数,演示了如何处理一个结构相对复杂的 Excel 文件,并按照需求进行初步的数据加载和格式化。

6. 总结与下一步

恭喜你!通过阅读本指南,你已经掌握了使用 Pandas 的 pd.read_excel() 函数读取 Excel 文件的各种核心技巧。你学会了:

  • 安装 Pandas 和必要的 Excel 读取引擎。
  • 使用最简单的命令读取 Excel 文件。
  • 如何指定要读取的工作表 (sheet_name)。
  • 如何处理复杂的表头 (header)。
  • 如何跳过不需要的行 (skiprows, skipfooter)。
  • 如何只读取感兴趣的列 (usecols)。
  • 如何处理各种形式的缺失值 (na_values, keep_default_na)。
  • 如何指定列的数据类型 (dtype)。
  • 如何正确解析日期时间数据 (parse_dates, date_parser, date_format)。
  • 如何设置合适的索引列 (index_col)。
  • 如何使用 nrows 限制读取的行数。
  • 以及一些其他高级参数和注意事项。

pd.read_excel() 函数是 Pandas 强大的数据处理能力的起点。成功读取数据只是第一步。接下来,你可以利用 Pandas DataFrame 的丰富功能,对数据进行清洗(处理缺失值、异常值)、转换(格式转换、计算新列)、分析(聚合、分组、统计)以及可视化。

记住,解决实际问题需要结合具体的数据结构和需求灵活运用这些参数。遇到新的 Excel 文件时,首先应该打开文件,观察其结构(有多少个工作表?表头在哪里?是否有额外信息?数据格式如何?),然后根据观察结果选择合适的 read_excel 参数。

多实践、多尝试是掌握 Pandas 的最好方法。现在,你可以拿起手边的 Excel 文件,尝试用 Pandas 将它们读取到 DataFrame 中,并开始你的数据探索之旅吧!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部