Фильтрация и агрегирование на основе другого фрейма данныхPython

Программы на Python
Ответить
Anonymous
 Фильтрация и агрегирование на основе другого фрейма данных

Сообщение Anonymous »

Скажем, у меня есть

Код: Выделить всё

df1 = pl.DataFrame({'start': [1., 2., 4.], 'end': [2., 4., 6.]})
df2 = pl.DataFrame({'idx': [1., 1.7, 2.3, 2.5, 3., 4.], 'values': [3, 1, 4, 2, 3, 5]})
Они выглядят так:

Код: Выделить всё

In [8]: df1
Out[8]:
shape: (3, 2)
┌───────┬─────┐
│ start ┆ end │
│ ---   ┆ --- │
│ f64   ┆ f64 │
╞═══════╪═════╡
│ 1.0   ┆ 2.0 │
│ 2.0   ┆ 4.0 │
│ 4.0   ┆ 6.0 │
└───────┴─────┘

In [9]: df2
Out[9]:
shape: (6, 2)
┌─────┬────────┐
│ idx ┆ values │
│ --- ┆ ---    │
│ f64 ┆ i64    │
╞═════╪════════╡
│ 1.0 ┆ 3      │
│ 1.7 ┆ 1      │
│ 2.3 ┆ 4      │
│ 2.5 ┆ 2      │
│ 3.0 ┆ 3      │
│ 4.0 ┆ 5      │
└─────┴────────┘
Я хотел бы получить что-то вроде этого:

Код: Выделить всё

In [6]: expected = pl.DataFrame({
...:     'start': [1., 2., 4.],
...:     'end': [2., 4.5, 6.],
...:     'sum_values': [4, 9, 5]
...: })

In [7]: expected
Out[7]:
shape: (3, 3)
┌───────┬─────┬────────────┐
│ start ┆ end ┆ sum_values │
│ ---   ┆ --- ┆ ---        │
│ f64   ┆ f64 ┆ i64        │
╞═══════╪═════╪════════════╡
│ 1.0   ┆ 2.0 ┆ 4          │
│ 2.0   ┆ 4.5 ┆ 9          │
│ 4.0   ┆ 6.0 ┆ 5          │
└───────┴─────┴────────────┘
Вот неэффективный способ сделать это, который я придумал, используя map_rows:

Код: Выделить всё

(
df1.with_columns(
df1.map_rows(
lambda row: df2.filter(
pl.col("idx").is_between(row[0], row[1], closed="left")
)["values"].sum()
)["map"].alias("sum_values")
)
)
Он дает правильный результат, но поскольку он использует map_rows и лямбда-функцию Python, он не так эффективен, как мог бы быть.
Есть ли способ написать это с использованием API собственных выражений Polars?>

Подробнее здесь: https://stackoverflow.com/questions/765 ... -dataframe
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»