Поскольку Rank не обрабатывает нулевые значения, я хочу написать функцию Rank, которая может обрабатывать нулевые значения.
import numpy as np
import polars as pl
df = pl.DataFrame({
'group': ['a'] * 3 + ['b'] * 3,
'value': [2, 1, None, 4, 5, 6],
})
df
shape: (6, 2)
┌───────┬───────┐
│ group ┆ value │
│ --- ┆ --- │
│ str ┆ i64 │
╞═══════╪═══════╡
│ a ┆ 2 │
│ a ┆ 1 │
│ a ┆ null │
│ b ┆ 4 │
│ b ┆ 5 │
│ b ┆ 6 │
└───────┴───────┘
Это работает хорошо, если я не использовал group_by, поскольку я могу использовать «когда-то-иначе» для установки значений.
def valid_rank(expr: pl.Expr, descending=False):
"""handle null values when rank"""
FLOAT_MAX, FLOAT_MIN = np.finfo(float).max, np.finfo(float).min
mask = expr.is_null()
expr = expr.fill_null(FLOAT_MIN) if descending else expr.fill_null(FLOAT_MAX)
return pl.when(~mask).then(expr.rank(descending=descending)).otherwise(None)
df.with_columns(valid_rank(pl.col('value')))
shape: (6, 2)
┌───────┬───────┐
│ group ┆ value │
│ --- ┆ --- │
│ str ┆ f32 │
╞═══════╪═══════╡
│ a ┆ 2.0 │
│ a ┆ 1.0 │
│ a ┆ null │
│ b ┆ 3.0 │
│ b ┆ 4.0 │
│ b ┆ 5.0 │
└───────┴───────┘
Однако в контексте group_by предикат col("value").is_not_null() в if->then->иначе не является агрегацией, поэтому я получу
ComputeError: the predicate 'not(col("value").is_null())' in 'when->then->otherwise' is not a valid aggregation and might produce a different number of rows than the group_by operation would
Обычно мне приходится выполнять некоторые вычисления внутри каждой группы после ранга, и меня беспокоит производительность, если я использую part_by для разделения DataFrame. Поэтому я надеюсь, что в Polars могут быть такие выражения, как np.putmask или подобные функции, которые смогут устанавливать значения внутри каждой группы.
def valid_rank(expr: pl.Expr, descending=False):
"""handle null values when rank"""
FLOAT_MAX, FLOAT_MIN = np.finfo(float).max, np.finfo(float).min
mask = expr.is_null()
expr = expr.fill_null(FLOAT_MIN) if descending else expr.fill_null(FLOAT_MAX)
# return pl.putmask(expr.rank(descending=descending), mask, None) # hope
# return expr.rank(descending).set(mask, None) # hope
Подробнее здесь: https://stackoverflow.com/questions/732 ... -py-polars
Как установить замаскированные значения внутри каждой группы в контексте group_by, используя py-polars ⇐ Python
Программы на Python
1762023637
Anonymous
Поскольку Rank не обрабатывает нулевые значения, я хочу написать функцию Rank, которая может обрабатывать нулевые значения.
import numpy as np
import polars as pl
df = pl.DataFrame({
'group': ['a'] * 3 + ['b'] * 3,
'value': [2, 1, None, 4, 5, 6],
})
df
shape: (6, 2)
┌───────┬───────┐
│ group ┆ value │
│ --- ┆ --- │
│ str ┆ i64 │
╞═══════╪═══════╡
│ a ┆ 2 │
│ a ┆ 1 │
│ a ┆ null │
│ b ┆ 4 │
│ b ┆ 5 │
│ b ┆ 6 │
└───────┴───────┘
Это работает хорошо, если я не использовал group_by, поскольку я могу использовать «когда-то-иначе» для установки значений.
def valid_rank(expr: pl.Expr, descending=False):
"""handle null values when rank"""
FLOAT_MAX, FLOAT_MIN = np.finfo(float).max, np.finfo(float).min
mask = expr.is_null()
expr = expr.fill_null(FLOAT_MIN) if descending else expr.fill_null(FLOAT_MAX)
return pl.when(~mask).then(expr.rank(descending=descending)).otherwise(None)
df.with_columns(valid_rank(pl.col('value')))
shape: (6, 2)
┌───────┬───────┐
│ group ┆ value │
│ --- ┆ --- │
│ str ┆ f32 │
╞═══════╪═══════╡
│ a ┆ 2.0 │
│ a ┆ 1.0 │
│ a ┆ null │
│ b ┆ 3.0 │
│ b ┆ 4.0 │
│ b ┆ 5.0 │
└───────┴───────┘
Однако в контексте group_by предикат col("value").is_not_null() в if->then->иначе не является агрегацией, поэтому я получу
ComputeError: the predicate 'not(col("value").is_null())' in 'when->then->otherwise' is not a valid aggregation and might produce a different number of rows than the group_by operation would
Обычно мне приходится выполнять некоторые вычисления внутри каждой группы после ранга, и меня беспокоит производительность, если я использую part_by для разделения DataFrame. Поэтому я надеюсь, что в Polars могут быть такие выражения, как np.putmask или подобные функции, которые смогут устанавливать значения внутри каждой группы.
def valid_rank(expr: pl.Expr, descending=False):
"""handle null values when rank"""
FLOAT_MAX, FLOAT_MIN = np.finfo(float).max, np.finfo(float).min
mask = expr.is_null()
expr = expr.fill_null(FLOAT_MIN) if descending else expr.fill_null(FLOAT_MAX)
# return pl.putmask(expr.rank(descending=descending), mask, None) # hope
# return expr.rank(descending).set(mask, None) # hope
Подробнее здесь: [url]https://stackoverflow.com/questions/73252912/how-to-set-masked-values-within-each-group-in-group-by-context-using-py-polars[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия