在 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]
Run Code Online (Sandbox Code Playgroud)
我还没有找到直接在 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]
Run Code Online (Sandbox Code Playgroud)
我在映射表达式字典时看到了这个答案,但由于它的链,when/then/otherwise它可能不适用于大型字典。
Polars有专用的map_dict表情。用这个。
将 python 字典映射到极坐标系上应该始终被视为反模式。这将非常慢,并且您想要的在语义上等于连接。
使用联接。它们经过深度优化、多线程并且不使用 python。
import polars as pl
dic = { 1: 'a', 2: 'b', 3: 'c' }
mapper = pl.DataFrame({
"keys": list(dic.keys()),
"values": list(dic.values())
})
pl.Series([1, 2, 3, 4]).to_frame("keys").join(mapper, on="keys", how="left").to_series(1)
Run Code Online (Sandbox Code Playgroud)
Series: 'values' [str]
[
"a"
"b"
"c"
null
]
Run Code Online (Sandbox Code Playgroud)
小智 6
0.16.3由于Polars版本具有以下Expr.map_dict 方法,因此可以使用以下方法0.16.7:Series.map_dict
import polars as pl
mapping_dict = {1: "a", 2: "b", 3: "c"}
# pl.Series.map_dict
pl.Series([1, 2, 3, 4]).map_dict(mapping_dict)
# pl.Expr.map_dict
pl_df = pl.Series(name="to_map_col", values=[1, 2, 3, 4]).to_frame()
pl_df.with_columns(pl.col("to_map_col").map_dict(mapping_dict))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4611 次 |
| 最近记录: |