Python Polars: как применить агрегатную функцию для всех столбцов и передать один дополнительный столбец в качестве аргуPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Python Polars: как применить агрегатную функцию для всех столбцов и передать один дополнительный столбец в качестве аргу

Сообщение Anonymous »

У меня есть ленивый фрейм данных (с использованием scan_parquet), как показано ниже,

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

df = pl.from_repr("""
┌────────┬──────┬──────┬──────┬──────┐
│ region ┆ time ┆ sen1 ┆ sen2 ┆ sen3 │
│ ---    ┆ ---  ┆ ---  ┆ ---  ┆ ---  │
│ str    ┆ i64  ┆ f64  ┆ f64  ┆ f64  │
╞════════╪══════╪══════╪══════╪══════╡
│ us     ┆ 1    ┆ 10.0 ┆ 11.0 ┆ 12.0 │
│ us     ┆ 2    ┆ 11.0 ┆ 14.0 ┆ 13.0 │
│ us     ┆ 3    ┆ 10.1 ┆ 10.0 ┆ 12.3 │
│ us     ┆ 4    ┆ 13.0 ┆ 11.1 ┆ 14.0 │
│ us     ┆ 5    ┆ 12.0 ┆ 11.0 ┆ 19.0 │
│ uk     ┆ 1    ┆ 10.0 ┆ 11.0 ┆ 12.1 │
│ uk     ┆ 2    ┆ 11.0 ┆ 14.0 ┆ 13.0 │
│ uk     ┆ 3    ┆ 10.1 ┆ 10.0 ┆ 12.0 │
│ uk     ┆ 4    ┆ 13.0 ┆ 11.1 ┆ 14.0 │
│ uk     ┆ 5    ┆ 12.0 ┆ 11.0 ┆ 19.0 │
│ uk     ┆ 6    ┆ 13.7 ┆ 11.1 ┆ 14.0 │
│ uk     ┆ 7    ┆ 12.0 ┆ 11.0 ┆ 21.9 │
└────────┴──────┴──────┴──────┴──────┘
""")
Я хочу найти максимум и минимум для всех датчиков для каждого региона, и при этом мне также нужно время, в которое произошло максимум и минимум.
Итак, я написал приведенную ниже агрегатную функцию:

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

def my_custom_agg(t,v):
smax = v.max()
smin = v.min()
smax_t = t[v.arg_max()]
smin_t = t[v.arg_max()]
return [smax, smin, smax_t, smin_t]
Затем я выполнил группировку, как показано ниже:

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

df.group_by('region').agg(
pl.all().map_elements(lambda s: my_custom_agg(pl.col('time'),s))
)
Когда я это делаю, я получаю следующую ошибку:

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

TypeError: 'Expr' object is not subscribable
Ожидаемый результат,

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

region sen1              sen2              sen3
us     [13.0,10.0,4,1]   [14.0,10.0,2,3]   [19.0,12.0,5,1]
uk     [13.7,10.0,6,1]   [14.0,10.0,2,3]   [21.9,12.0,7,3]

# which I will unpivot and transform to below,
region   sname  smax  smin smax_t  smin_t
us       sen1   13.0  10.0 4       1
us       sen2   14.0  10.0 2       3
us       sen3   19.0  12.0 5       1
uk       sen1   13.7  10.0 6       1
uk       sen2   14.0  10.0 2       3
uk       sen3   21.9  12.0 7       3

Скажите, пожалуйста, как передать в качестве аргумента еще один столбец? Если есть альтернативный способ сделать это, я буду рад это услышать, поскольку я гибко подхожу к формату вывода.
Примечание: в моем реальном наборе данных у меня есть датчики 8 тыс., так что это так. лучше использовать pl.all().
Спасибо за поддержку.

Подробнее здесь: https://stackoverflow.com/questions/743 ... ass-one-ad
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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