0

0

Polars 中按前缀合并列并重复非模式列以对齐长格式

碧海醫心

碧海醫心

发布时间:2026-01-30 14:11:13

|

950人浏览过

|

来源于php中文网

原创

Polars 中按前缀合并列并重复非模式列以对齐长格式

本文介绍如何在 polars 中将具有相同前缀(如 `a_0`, `a_1`, `a_2`)的多列纵向堆叠为单列(如 `a`),同时自动复制其他非模式列(如 `words`, `groups`)以匹配扩展后的行数,实现高效、可扩展的“宽转长+重排”操作。

要实现题目中描述的变换——即把 a_0, a_1, a_2 按列顺序垂直拼接成一列 a,同理拼接 b_0, b_1, b_2 成 b,并让 words 和 groups 等“标识列”按需重复(每个原始值重复 m=3 次,对应每组 a_*/b_* 列的数量),核心思路是:利用 unpivot 打散结构 → 提取前缀作为新分组键 → 构建跨列一致的索引 → 用 pivot 重构为长格式

以下是完整、健壮的解决方案:

WPS AI
WPS AI

金山办公发布的AI办公应用,提供智能文档写作、阅读理解和问答、智能人机交互的能力。

下载
import polars as pl
import numpy as np
import string

# 构造示例数据(同题)
rng = np.random.default_rng(42)
nr = 3
letters = list(string.ascii_letters)
uppercase = list(string.ascii_uppercase)
words, groups = [], []
for i in range(nr):
    word = ''.join([rng.choice(letters) for _ in range(rng.integers(3, 20))])
    words.append(word)
    group = rng.choice(uppercase)
    groups.append(group)
df = pl.DataFrame({
    "a_0": np.linspace(0, 1, nr),
    "a_1": np.linspace(1, 2, nr),
    "a_2": np.linspace(2, 3, nr),
    "b_0": np.random.rand(nr),
    "b_1": 2 * np.random.rand(nr),
    "b_2": 3 * np.random.rand(nr),
    "words": words,
    "groups": groups,
})

# ✅ 核心转换:宽→长 + 前缀归并 + 重复对齐
result = (
    df
    .unpivot(
        index=["words", "groups"],  # 保留为标识列,不参与展开
        on=[col for col in df.columns if "_" in col]  # 显式指定待展开列(更安全)
    )
    .with_columns(
        pl.col("variable").str.replace(r"_\d+$", "")  # 提取前缀:a_0 → "a", b_1 → "b"
    )
    .with_columns(
        index = pl.int_range(0, pl.len()).over("variable")  # 每个前缀组内独立编号:[0,1,2] 循环
    )
    .pivot(
        on="variable",
        index=["index", "words", "groups"],
        values="value",
        aggregate_function=None  # 禁用聚合,确保一对一映射
    )
    .drop("index")  # 移除临时索引列
)

print(result)

输出结果与预期完全一致(shape: (9, 4)):

shape: (9, 4)
┌─────────────────┬────────┬─────┬──────────┐
│ words           ┆ groups ┆ a   ┆ b        │
│ ---             ┆ ---    ┆ --- ┆ ---      │
│ str             ┆ str    ┆ f64 ┆ f64      │
╞═════════════════╪════════╪═════╪══════════╡
│ OIww            ┆ W      ┆ 0.0 ┆ 0.653892 │
│ KkeB            ┆ Z      ┆ 0.5 ┆ 0.408888 │
│ NLOAgRxAtjWOHuQ ┆ O      ┆ 1.0 ┆ 0.423949 │
│ OIww            ┆ W      ┆ 1.0 ┆ 0.234362 │
│ KkeB            ┆ Z      ┆ 1.5 ┆ 0.213767 │
│ NLOAgRxAtjWOHuQ ┆ O      ┆ 2.0 ┆ 0.646378 │
│ OIww            ┆ W      ┆ 2.0 ┆ 0.880558 │
│ KkeB            ┆ Z      ┆ 2.5 ┆ 1.833025 │
│ NLOAgRxAtjWOHuQ ┆ O      ┆ 3.0 ┆ 0.116173 │
└─────────────────┴────────┴─────┴──────────┘

关键要点说明:

  • unpivot(index=...) 是起点:它将所有非 index 列(即 a_0, a_1, ...)转为两列 variable(原列名)和 value(原值),同时自动广播 words/groups 到每一行,为后续重复打下基础。
  • 正则提取前缀:str.replace(r"_\d+$", "") 安全地剥离末尾 _数字(支持 _10, _99 等),比 "_.*" 更精确,避免误删含下划线的合法前缀。
  • over("variable") 构建组内序号:确保 a_0, a_1, a_2 的值在 index=0,1,2 下严格对齐,这是实现“先列0全部、再列1全部…”顺序的核心。
  • pivot(..., aggregate_function=None):显式禁用聚合(默认为 first),防止因重复 index+words+groups 组合导致意外丢值;Polars 1.0+ 支持此参数,推荐使用。
  • 健壮性增强:通过 on=[...] 显式指定待展开列,避免误处理未来新增的 c_0 或 meta_info 等非模式列。
⚠️ 注意:若列名模式更复杂(如 a_x, a_y, a_z),只需调整正则表达式(如 r"_\w+$")并确保 unpivot.on 范围准确。该方案天然支持任意数量的前缀组(a_*, b_*, c_*…)和任意列数,时间复杂度为线性,适合大规模数据处理。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

515

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

251

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

748

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

215

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

351

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

293

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

236

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

532

2023.12.06

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

7

2026.01.30

热门下载

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

精品课程

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

共24课时 | 3.1万人学习

【李炎恢】ThinkPHP8.x 后端框架课程
【李炎恢】ThinkPHP8.x 后端框架课程

共50课时 | 4.5万人学习

Swoft2.x速学之http api篇课程
Swoft2.x速学之http api篇课程

共16课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号