如何将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
相关产品推荐
相关产品推荐

