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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:01:00