You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Python字典映射到Polars Series?求推荐实现方案

在Polars中实现类似Pandas.map字典映射的方案分析

先回顾Pandas中的字典映射用法:

import pandas as pd

dic = {1: 'a', 2: 'b', 3: 'c'}
pd.Series([1, 2, 3, 4]).map(dic)  # 返回 ["a", "b", "c", NaN]

你摸索的三种方案各有优劣,同时Polars也有更简洁高效的原生方案,以下是详细分析:

现有方案的优缺点

  • Approach 1 - map_elements
    写法直观,但本质是Python层面的逐元素遍历,大数据量下性能较差,无法利用Polars的向量化优化,仅适合小数据集快速验证。

    import polars as pl
    
    dic = {1: 'a', 2: 'b', 3: 'c'}
    pl.Series([1, 2, 3, 4]).map_elements(lambda v: dic.get(v, None))  # 返回 ["a", "b", "c", null]
    
  • Approach 2 - left join
    基于Polars的向量化join操作,性能最优,尤其适合大型字典或大数据集。缺点是写法稍显繁琐,需要将Series转成DataFrame后再关联。

    (
        pl.Series([1, 2, 3, 4])
        .alias('key')
        .to_frame()
        .join(
            pl.DataFrame({'key': list(dic.keys()), 'value': list(dic.values())}),
            on='key', how='left',
        )['value']
    )  # 返回 ["a", "b", "c", null]
    
  • Approach 3 - 转Pandas再返回
    依赖Pandas的实现,适合熟悉Pandas的开发者,但数据转换会带来额外开销,大数据量下不推荐使用。

    pl.from_pandas(pl.Series([1, 2, 3, 4]).to_pandas().map(dic))  # 返回 ["a", "b", "c", null]
    
  • when/then/otherwise链式调用
    如你所说,这种方式需要为字典每个键写一个when条件,大型字典完全不可行,仅适合极少量键的映射场景。

更优的原生方案:使用replace方法

Polars的Series.replace()方法直接支持字典映射,是专门为这类场景设计的原生向量化操作,兼顾简洁性与性能:

pl.Series([1, 2, 3, 4]).replace(dic, default=None)  # 返回 ["a", "b", "c", null]

如果是在DataFrame的表达式上下文里,写法同样简洁:

df = pl.DataFrame({'key': [1, 2, 3, 4]})
df.with_columns(pl.col('key').replace(dic, default=None).alias('value'))

该方法内部是向量化实现,性能接近left join,但写法更简洁,是Polars中推荐的字典映射方式。

内容的提问来源于stack exchange,提问作者T.H Rice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 20:15:34