如何在 Polars 中执行 join_asof 仅向后查找并在特定条件下进行匹配?

问题描述 投票:0回答:1

我正在尝试在 Polars 中执行

join_asof
,它只向后看时间,忽略同一行上的匹配。具体来说,我希望它找到
Team
Field
完全匹配的最后一行,但前提是
Wk
值小于当前行的
Wk

目标是获得最近比赛的最后

GeneralLambda
,无论是“客场”还是“主场”,不包括当前比赛。我认为最好的方法是使用
join_asof
,但我正在努力解决如何使其只考虑过去的行并在
Team
Field
上进行匹配。

这里有一个 DataFrame 示例来说明:

季节 团队 田野 通用Lambda
2024 25 A队 离开 2.123456
2024 25 B队 首页 1.234567
2024 25 C队 离开 0.987654
2024 25 D队 首页 1.345678
2024 25 E队 离开 1.456789
2024 26 A队 首页 1.234567
2024 26 B队 离开 1.345678
2024 26 C队 首页 0.876543
2024 26 D队 离开 1.456789
2024 26 E队 首页 1.567890
2024 27 A队 离开 2.278759
2024 27 B队 离开 1.103829
2024 27 C队 首页 0.992563
2024 27 D队 首页 1.089324
2024 27 E队 首页 1.074221

对于每一行,我需要将其与最后一个匹配行连接起来,其中:

  • Team
    是一样的,
  • Field
    是一样的,
  • Wk
    小于当前行的 Wk。

我希望 DataFrame 看起来像这样:

季节 团队 田野 通用Lambda Prev_GeneralLambda
2024 25 A队 离开 2.123456 最后的价值
2024 25 B队 首页 1.234567 BLastHomeValue
2024 25 C队 离开 0.987654 CLastAwayValue
2024 25 D队 首页 1.345678 DLastHomeValue
2024 25 E队 离开 1.456789 ELastAwayValue
2024 26 A队 首页 1.234567 最后的房屋价值
2024 26 B队 离开 1.345678 BLastAwayValue
2024 26 C队 首页 0.876543 CLastHomeValue
2024 26 D队 离开 1.456789 DLastAwayValue
2024 26 E队 首页 1.567890 ELastHomeValue
2024 27 A队 离开 2.278759 2.123456
2024 27 B队 离开 1.103829 1.345678
2024 27 C队 首页 0.992563 0.876543
2024 27 D队 首页 1.089324 1.345678
2024 27 E队 首页 1.074221 1.567890

Polars 有办法做到这一点吗?

python pandas dataframe join python-polars
1个回答
0
投票
(
    df
    .sort("Wk")
    .with_columns(
        pl.col("GeneralLambda").shift(1).over("Team","Field")
    )
)
shape: (15, 5)
┌────────┬─────┬───────┬───────┬───────────────┐
│ Season ┆ Wk  ┆ Team  ┆ Field ┆ GeneralLambda │
│ ---    ┆ --- ┆ ---   ┆ ---   ┆ ---           │
│ i64    ┆ i64 ┆ str   ┆ str   ┆ f64           │
╞════════╪═════╪═══════╪═══════╪═══════════════╡
│ 2024   ┆ 25  ┆ TeamA ┆ Away  ┆ null          │
│ 2024   ┆ 25  ┆ TeamB ┆ Home  ┆ null          │
│ 2024   ┆ 25  ┆ TeamC ┆ Away  ┆ null          │
│ 2024   ┆ 25  ┆ TeamD ┆ Home  ┆ null          │
│ 2024   ┆ 25  ┆ TeamE ┆ Away  ┆ null          │
│ …      ┆ …   ┆ …     ┆ …     ┆ …             │
│ 2024   ┆ 27  ┆ TeamA ┆ Away  ┆ 2.123456      │
│ 2024   ┆ 27  ┆ TeamB ┆ Away  ┆ 1.345678      │
│ 2024   ┆ 27  ┆ TeamC ┆ Home  ┆ 0.876543      │
│ 2024   ┆ 27  ┆ TeamD ┆ Home  ┆ 1.345678      │
│ 2024   ┆ 27  ┆ TeamE ┆ Home  ┆ 1.56789       │
└────────┴─────┴───────┴───────┴───────────────┘
© www.soinside.com 2019 - 2024. All rights reserved.