В качестве простого примера — предположим, что у меня есть два фрейма данных:
Код: Выделить всё
import polars as pl
df_1 = pl.DataFrame(
{
"time": pl.date_range(
pl.date(2021, 1, 1),
pl.date(2022, 1, 1),
interval="1d",
eager=True
),
"x": pl.int_range(0, 366, eager=True),
}
)
df_2 = pl.DataFrame(
{
"time": pl.date_range(
pl.date(2021, 1, 1),
pl.date(2021, 2, 1),
interval="1mo",
eager=True
),
"y": [50, 100],
}
)
Я могу выполнить это с помощью map_elements/lambda (см. ниже), но мне просто интересно, есть ли более идиоматический способ выполнения эту операцию?
Код: Выделить всё
df_2.group_by("y").agg(
pl.col("y").map_elements(lambda s: df_1.filter(pl.col("x") < s).select(pl.col("time")).max().item()).alias('latest')
)
Код: Выделить всё
shape: (2, 2)
┌─────┬────────────┐
│ y ┆ latest │
│ --- ┆ --- │
│ i64 ┆ date │
╞═════╪════════════╡
│ 50 ┆ 2021-02-19 │
│ 100 ┆ 2021-04-10 │
└─────┴────────────┘
Можно ли предварительно фильтровать df_1 перед использованием join_asof. Поэтому переключив вопрос на поиск минимального значения вместо максимального, в отдельном случае я бы сделал следующее:
Код: Выделить всё
(
df_2
.filter(pl.col('y') == 50)
.join_asof(
df_1
.sort("x")
.filter(pl.col('time') > date(2021,11,1))
.select(
pl.col("time").cum_min().alias("time_min"),
pl.col("x").alias("original_x"),
(pl.col("x") + 1).alias("x"),
),
left_on="y",
right_on="x",
strategy="forward",
)
)
Подробнее здесь: https://stackoverflow.com/questions/732 ... sions-with
Мобильная версия