Polars 中高效处理 Excel 多行表头:原生扁平化列名并自定义分隔符

酷枫君_7711

酷枫君_7711

2026-08-31

587人浏览

原创

Polars 中高效处理 Excel 多行表头:原生扁平化列名并自定义分隔符

本文介绍如何在 polars 中不依赖 pandas,直接读取含多行表头的 excel 文件,将前 n 行作为复合列名、用指定分隔符拼接后赋给数据行,实现高性能、内存友好的表头扁平化。

本文介绍如何在 polars 中不依赖 pandas,直接读取含多行表头的 excel 文件,将前 n 行作为复合列名、用指定分隔符拼接后赋给数据行,实现高性能、内存友好的表头扁平化。

在实际数据分析中,尤其是处理业务导出的 Excel 报表时,常遇到「多行表头」结构(如第一行为大类 A/B,第二行为子类 one/two)。Pandas 通过 MultiIndex 原生支持该结构,但 Polars 作为列式、惰性计算的高性能 DataFrame 库,并不提供多级列索引。因此,常见做法是“先 Pandas → 扁平化 → 转 Polars → 计算 → 再转回 Pandas”,但这在大数据场景下会引发显著的序列化开销与内存冗余。

幸运的是,Polars 完全可以在不引入 Pandas 的前提下,原生完成多行表头的解析与扁平化——核心思路是:分两次读取 Excel:一次提取表头行构建列名,一次读取数据主体,再动态重命名列。整个过程纯 Polars、零中间转换、完全惰性友好。

✅ 推荐方案:双读取 + 列名拼接(原生 Polars)

以下为完整可运行示例(需安装 fastexcel 或 xlsxwriter):

import polars as pl

# 1. 模拟生成带双行表头的 Excel(仅用于演示;生产中直接读真实文件)
dummy_data = pl.DataFrame([
    ("A", "one", "1", "5"),
    ("A", "two", "2", "6"),
    ("B", "one", "3", "7"),
    ("B", "two", "4", "8"),
])
dummy_data.write_excel("Book1.xlsx", include_header=False)  # 不写入默认表头

# 2. 提取前 N 行作为表头(N_HEADERS = 2)
N_HEADERS = 2
headers_df = pl.read_excel(
    "Book1.xlsx",
    read_options={"header_row": None, "n_rows": N_HEADERS}
)

# 将每列的 N_ROWS 值纵向拼接(如 ["A","A","B","B"] → "A-A-B-B" ❌ 错误!)
# 正确做法:按行横向拼接 —— 第0行 + 分隔符 + 第1行 → 得到 ["A-one", "A-two", "B-one", "B-two"]
flattened_cols = headers_df.transpose().select(
    pl.all().str.join("-")  # 关键:transpose 后每列变为一行,join("-") 即拼接该行所有单元格
).transpose().row(0)  # 取第一行(即唯一行)作为新列名元组

# 3. 读取剩余数据(跳过表头行),并赋值列名
data_df = pl.read_excel(
    "Book1.xlsx",
    read_options={
        "header_row": None,
        "skip_rows": N_HEADERS,
        "dtypes": pl.Int64  # 显式指定类型,避免字符串推断
    }
)
data_df = data_df.rename(dict(zip(data_df.columns, flattened_cols)))

print(data_df)

输出:

PDF to Excel
PDF to Excel

将PDF中的表格和文本提取到Excel工作簿(XLSX),每页对应一个工作表。

下载
shape: (2, 4)
┌───────┬───────┬───────┬───────┐
│ A-one ┆ A-two ┆ B-one ┆ B-two │
│ ---   ┆ ---   ┆ ---   ┆ ---   │
│ i64   ┆ i64   ┆ i64   ┆ i64   │
╞═══════╪═══════╪═══════╪═══════╡
│ 1     ┆ 2     ┆ 3     ┆ 4     │
│ 5     ┆ 6     ┆ 7     ┆ 8     │
└───────┴───────┴───────┴───────┘

? 关键技巧说明:

  • transpose() 是实现「按行拼接」的核心:它将原始 header 表(2 行 × 4 列)转为(4 行 × 2 列),此时每行对应一个最终列名的两个层级(如 ["A","one"]),再对每行调用 .str.join("-") 即得 "A-one"。
  • read_options={"header_row": None} 禁用自动表头识别,确保精确控制读取逻辑。
  • dtypes 显式声明可避免字符串类型带来的后续计算开销与内存浪费。

⚠️ 注意事项与最佳实践

  • 性能优势明显:全程无 Pandas 对象创建/转换,尤其适合 GB 级 Excel;fastexcel 引擎读取速度远超 openpyxl。
  • 分隔符灵活:将 "-" 替换为 "_"、"." 或 ":" 即可适配不同规范(如 A.one, A:one)。
  • 健壮性增强建议:
    • 使用 pl.col("*").cast(pl.String) 预处理 header 行,防止空值或数字导致 str.join 报错;
    • 对 flattened_cols 添加去重与合法性校验(如是否含非法字符、长度是否匹配数据列数);
    • 若表头含空单元格,可用 pl.all().fill_null("") 预填充。
  • 无需回写 Pandas:若最终需导出带格式 Excel(如合并单元格表头),仍需 Pandas + openpyxl;但仅做数据清洗/聚合时,Polars 全流程闭环即可,彻底规避跨库瓶颈。

综上,Polars 原生支持多行表头扁平化,不仅语法简洁、性能卓越,更契合其「显式、可控、高性能」的设计哲学。告别 Pandas 中转,让数据管道更轻、更快、更可靠。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

excel

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1631

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4024

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1629

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

23177

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2847

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2887

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1123

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2223

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 43.7万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 3.5万人学习