Polars教程:基于字典映射为DataFrame动态创建多标签布尔列

星丽小哥_6834

星丽小哥_6834

2026-10-10

525人浏览

原创

Polars教程:基于字典映射为DataFrame动态创建多标签布尔列

本文详解如何在Polars中高效地将字符串列表列(如食品标签)依据键值映射字典,批量生成以类别名为列名的标记列(如“Fruit”“Meat”),避免循环赋值陷阱,充分利用list.contains、pl.when/then和any_horizontal等原生操作实现向量化处理。

本文详解如何在polars中高效地将字符串列表列(如食品标签)依据键值映射字典,批量生成以类别名为列名的标记列(如“fruit”“meat”),避免循环赋值陷阱,充分利用`list.contains`、`pl.when/then`和`any_horizontal`等原生操作实现向量化处理。

在Polars中实现“根据字典映射扩展多列”的核心原则是:不就地修改、优先使用结构化数据类型、用声明式表达式替代显式循环。与Pandas不同,Polars绝大多数操作(包括with_columns)返回的是新DataFrame,而非原地更新——因此必须显式赋值(如 df = df.with_columns(...)),否则结果会被丢弃。

首先,确保原始数据中“Food Provided”列为真正的列表类型(list[str]),而非逗号分隔的字符串。这是关键前提:字符串模糊匹配(如.str.contains("Apple"))易引发误匹配(如"Pineapple"被误判为含"Apple"),而list.contains()则进行精确元素匹配,语义清晰且性能更优。

以下是最推荐的实现方式(适用于一对一映射场景):

import polars as pl

# 构建示例DataFrame(注意:Food Provided 是 list[str])
df = pl.DataFrame({
    "index": [1, 2],
    "person": ["Billy", "Sally"],
    "Food Provided": [["Apple", "Hot dog"], ["Celery", "brownies"]]
})

# 映射字典:food -> category
food_types_dict = {"Apple": "Fruit", "Hot dog": "Meat", "Celery": "Vegetable", "brownies": "Dessert"}

# 动态生成多列:对每个 food/category 对,创建一列
df = df.with_columns(
    pl.when(pl.col("Food Provided").list.contains(food))
     .then(pl.lit("X"))
     .alias(category)
    for food, category in food_types_dict.items()
)

print(df)

输出:

python 查询技能
python 查询技能

查询客流数据,输出JSON格式,可直接导入Bitable等可视化工具

下载
shape: (2, 7)
┌───────┬────────┬────────────────────────┬───────┬───────────┬──────┬─────────┐
│ index ┆ person ┆ Food Provided          ┆ Fruit ┆ Vegetable ┆ Meat ┆ Dessert │
│ ---   ┆ ---    ┆ ---                    ┆ ---   ┆ ---       ┆ ---  ┆ ---     │
│ i64   ┆ str    ┆ list[str]              ┆ str   ┆ str       ┆ str  ┆ str     │
╞═══════╪════════╪════════════════════════╪═══════╪═══════════╪══════╪═════════╡
│ 1     ┆ Billy  ┆ ["Apple", "Hot dog"]   ┆ X     ┆ null      ┆ X    ┆ null    │
│ 2     ┆ Sally  ┆ ["Celery", "brownies"] ┆ null  ┆ X         ┆ null ┆ X       │
└───────┴────────┴────────────────────────┴───────┴───────────┴──────┴─────────┘

✅ 关键要点说明:

  • pl.when(...).then(...).alias(name) 构成条件列生成表达式;未满足条件时默认为null(即你所需的None效果);
  • for food, category in ... 是Python生成器表达式,Polars会将其展开为多个独立列定义;
  • 务必重赋值 df = df.with_columns(...),否则变换无效——这是新手最常忽略的陷阱。

⚠️ 进阶场景:一类多食(一对多映射)
若同一类别对应多种食物(如 "Vegetable": ["Celery", "Spinach", "Carrot"]),需改用pl.any_horizontal聚合多个list.contains条件:

food_types = {
    "Fruit": ["Apple", "Banana"],
    "Vegetable": ["Celery", "Spinach"],
    "Meat": ["Hot dog", "Chicken"],
    "Dessert": ["brownies", "Cake"]
}

df = df.with_columns(
    pl.when(pl.any_horizontal(
        pl.col("Food Provided").list.contains(food) for food in foods
    ))
    .then(pl.lit("X"))
    .alias(category)
    for category, foods in food_types.items()
)

? 替代方案(适合大规模映射):replace + explode + pivot
当映射关系复杂或需复用时,可先将列表元素批量转换为类别,再透视展开:

# 步骤1:将每个food元素替换为category(保留原列表结构)
df_temp = df.with_columns(
    food_categories = pl.col("Food Provided").list.eval(
        pl.element().replace(food_types_dict, default=None)
    ),
    value = pl.lit("X")
)

# 步骤2:展开类别列表,并透视为宽表
result = (df_temp
          .explode("food_categories")
          .pivot(
              on="food_categories",
              values="value",
              index=["index", "person", "Food Provided"]
          )
          .fill_null("null"))  # 可选:将null转为字符串

? 总结建议:

  • 始终使用list[str]而非字符串存储标签集合;
  • 避免for循环中多次调用with_columns(低效且易出错),应一次性生成所有列;
  • 列名必须唯一——若字典存在重复value(如两个food映射到同一category),需预先去重或改用一对多结构;
  • 所有操作均支持Lazy模式,生产环境建议链式调用lazy().with_columns(...).collect()以获得最佳性能。

相关文章

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

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

下载

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

相关专题

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

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

2023.07.20

1691

4

python能做什么
python能做什么

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

2023.07.25

4264

7

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

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

2023.07.31

1689

3

python教程
python教程

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

2023.08.03

24797

23

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

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

2023.08.04

3027

5

python eval
python eval

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

2023.08.04

3047

5

scratch和python区别
scratch和python区别

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

2023.08.11

1163

5

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

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

2023.08.10

596

4

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

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

2023.08.11

2363

5

热门下载

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

精品课程

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