如何在Polars中从另一个DataFrame获取正确数据?
使用Polars实现日期匹配的预期结果
你的问题出在map_elements的用法上:lambda函数里的pl.col("df2_date")是生成了Polars表达式对象,而非实际执行查询获取数据。Polars的map_elements适合处理单个元素的简单逻辑,但无法直接在lambda中引用上下文里的另一个DataFrame进行查询,这种场景应该用Polars的向量化连接操作来实现,效率更高也符合Polars的设计思路。
正确实现代码
import polars as pl df1 = pl.DataFrame({ "df1_date": [20221011, 20221012, 20221013, 20221014, 20221016], "df1_col1": ["foo", "bar", "foo", "bar", "foo"], }) df2 = pl.DataFrame({ "df2_date": [20221012, 20221015, 20221018], "df2_col1": ["1", "2", "3"], }) # 确保df2的日期列排序(join_asof要求右表按连接键排序) df2_sorted = df2.sort("df2_date") # 使用asof join实现"找小于等于当前日期的最大日期" result = df1.join_asof( df2_sorted, left_on="df1_date", right_on="df2_date", strategy="backward", # 匹配小于等于左表值的最大右表值 allow_parallel=False ).with_columns( # 对没有匹配到的行填充0 pl.col("df2_date").fill_null(0).alias("release_date") ).select( "df1_date", "df1_col1", "release_date" ) print(result)
输出结果
shape: (5, 3) ┌──────────┬──────────┬──────────────┐ │ df1_date ┆ df1_col1 ┆ release_date │ │ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ i64 │ ╞══════════╪══════════╪══════════════╡ │ 20221011 ┆ foo ┆ 0 │ │ 20221012 ┆ bar ┆ 20221012 │ │ 20221013 ┆ foo ┆ 20221012 │ │ 20221014 ┆ bar ┆ 20221012 │ │ 20221016 ┆ foo ┆ 20221015 │ └──────────┴──────────┴──────────────┘
关键说明
join_asof是Polars专门用于有序键的近似连接的操作,非常适合这种"为每个值找最近匹配值"的场景,比循环/map_elements效率高得多。strategy="backward"指定匹配小于等于左表键值的最大右表键值,正好对应你Pandas代码里的逻辑。- 因为df1的20221011没有匹配到任何df2的日期,
fill_null(0)会把空值替换为0,实现和Pandas代码一致的结果。
内容的提问来源于stack exchange,提问作者Arzx
相关产品推荐
相关产品推荐

