在Pandas中,我们可以使用
map
函数将字典映射到系列上,创建另一个具有映射值的系列。更一般地说,我认为它调用了参数的索引操作符,即[]
。import pandas as pd
dic = { 1: 'a', 2: 'b', 3: 'c' }
pd.Series([1, 2, 3, 4]).map(dic) # returns ["a", "b", "c", NaN]
我还没有在 Polars 中找到直接实现的方法,不过找到了几个替代方案。这些方案中有哪个是推荐的方式,或者有更好的方法吗?
import polars as pl
dic = { 1: 'a', 2: 'b', 3: 'c' }
# Approach 1 - apply
pl.Series([1, 2, 3, 4]).apply(lambda v: dic.get(v, None)) # returns ["a", "b", "c", null]
# Approach 2 - left join
(
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']
) # returns ["a", "b", "c", null]
# Approach 3 - to pandas and back
pl.from_pandas(pl.Series([1, 2, 3, 4]).to_pandas().map(dic)) # returns ["a", "b", "c", null]
我看到了这个关于将表达式字典映射到数据帧的回答,但由于它使用了when/then/otherwise
语句链,对于大型字典可能效果不佳。
mapper=pl.DataFrame([{'keys':x, 'values':y} for x,y in dic.items()])
,以获得轻微的性能提升。 - Dean MacGregor