Внутри группы мне нужно найти разницу между предыдущим ненулевым значением.
Например, если я начну со столбцов id и value, я хочу сгенерировать столбец результата:
┌─────┬───────┬────────┐
│ id ┆ value ┆ result │
│ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 │
╞═════╪═══════╪════════╡
│ a ┆ 10 ┆ null │ # 10 - oob
│ a ┆ null ┆ null │ # null - 10
│ a ┆ 30 ┆ 20 │ # 30 - 10
│ b ┆ 5 ┆ null │ # 5 - oob
│ b ┆ 10 ┆ 5 │ # 10 - 5
│ b ┆ null ┆ null │ # null - 10
│ b ┆ null ┆ null │ # null - null
│ b ┆ 40 ┆ 30 │ # 40 - 10
└─────┴───────┴────────┘
Для контекста: это промежуточный шаг. Конечная цель — заполнить нули, но не линейно, поскольку каждая строка имеет метку времени, поэтому мне придется распределить разницу между двумя ненулевыми значениями в соответствии с разницей во времени между каждой строкой. Например, для «a» разница во времени между первой и второй строкой может составлять 10 секунд, а между второй и третьей строкой — 30 секунд. Итак, при распределении разницы в 20 мне нужно будет назначить 20 * ( 10/40 ) первой строке и 20 * ( 30/40 ) второй строке.
Поэтому я применил следующее в полярах
import polars as pl
df = pl.DataFrame({
"id": ["a", "a", "a", "b", "b", "b", "b", "b"],
"value": [10, None, 30, 5, 10, None, None, 40]
})
df_delta = df.with_columns(
delta = pl.col("value").diff(1).over("id"),
delta_ignore = pl.col("value").diff(1, null_behavior="ignore").over("id")
)
Обратите внимание, что я применил игнорирование параметра null_behaviour ко второму столбцу. Однако результат, который я получаю:
┌─────┬───────┬───────┬──────────────┐
│ id ┆ value ┆ delta ┆ delta_ignore │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 ┆ i64 │
╞═════╪═══════╪═══════╪══════════════╡
│ a ┆ 10 ┆ null ┆ null │
│ a ┆ null ┆ null ┆ null │
│ a ┆ 30 ┆ null ┆ null │
│ b ┆ 5 ┆ null ┆ null │
│ b ┆ 10 ┆ 5 ┆ 5 │
│ b ┆ null ┆ null ┆ null │
│ b ┆ null ┆ null ┆ null │
│ b ┆ 40 ┆ null ┆ null │
└─────┴───────┴───────┴──────────────┘
В настоящее время я работаю над этим, расширяя раздел окна до .over("id", pl.col("value").is_not_null()) например,
df.with_columns(
delta = pl.col("value").diff(1).over("id", pl.col("value").is_not_null())
)
┌─────┬───────┬───────┐
│ id ┆ value ┆ delta │
│ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 │
╞═════╪═══════╪═══════╡
│ a ┆ 10 ┆ null │
│ a ┆ null ┆ null │
│ a ┆ 30 ┆ 20 │
│ b ┆ 5 ┆ null │
│ b ┆ 10 ┆ 5 │
│ b ┆ null ┆ null │
│ b ┆ null ┆ null │
│ b ┆ 40 ┆ 30 │
└─────┴───────┴───────┘
Подробнее здесь: https://stackoverflow.com/questions/770 ... -in-polars
Как игнорировать предыдущие нули при использовании diff или сдвиг в Polars? ⇐ Python
Программы на Python
1762021951
Anonymous
Внутри группы мне нужно найти разницу между предыдущим ненулевым значением.
Например, если я начну со столбцов id и value, я хочу сгенерировать столбец результата:
┌─────┬───────┬────────┐
│ id ┆ value ┆ result │
│ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 │
╞═════╪═══════╪════════╡
│ a ┆ 10 ┆ null │ # 10 - oob
│ a ┆ null ┆ null │ # null - 10
│ a ┆ 30 ┆ 20 │ # 30 - 10
│ b ┆ 5 ┆ null │ # 5 - oob
│ b ┆ 10 ┆ 5 │ # 10 - 5
│ b ┆ null ┆ null │ # null - 10
│ b ┆ null ┆ null │ # null - null
│ b ┆ 40 ┆ 30 │ # 40 - 10
└─────┴───────┴────────┘
Для контекста: это промежуточный шаг. Конечная цель — заполнить нули, но не линейно, поскольку каждая строка имеет метку времени, поэтому мне придется распределить разницу между двумя ненулевыми значениями в соответствии с разницей во времени между каждой строкой. Например, для «a» разница во времени между первой и второй строкой может составлять 10 секунд, а между второй и третьей строкой — 30 секунд. Итак, при распределении разницы в 20 мне нужно будет назначить 20 * ( 10/40 ) первой строке и 20 * ( 30/40 ) второй строке.
Поэтому я применил следующее в полярах
import polars as pl
df = pl.DataFrame({
"id": ["a", "a", "a", "b", "b", "b", "b", "b"],
"value": [10, None, 30, 5, 10, None, None, 40]
})
df_delta = df.with_columns(
delta = pl.col("value").diff(1).over("id"),
delta_ignore = pl.col("value").diff(1, null_behavior="ignore").over("id")
)
Обратите внимание, что я применил игнорирование параметра null_behaviour ко второму столбцу. Однако результат, который я получаю:
┌─────┬───────┬───────┬──────────────┐
│ id ┆ value ┆ delta ┆ delta_ignore │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 ┆ i64 │
╞═════╪═══════╪═══════╪══════════════╡
│ a ┆ 10 ┆ null ┆ null │
│ a ┆ null ┆ null ┆ null │
│ a ┆ 30 ┆ null ┆ null │
│ b ┆ 5 ┆ null ┆ null │
│ b ┆ 10 ┆ 5 ┆ 5 │
│ b ┆ null ┆ null ┆ null │
│ b ┆ null ┆ null ┆ null │
│ b ┆ 40 ┆ null ┆ null │
└─────┴───────┴───────┴──────────────┘
В настоящее время я работаю над этим, расширяя раздел окна до .over("id", pl.col("value").is_not_null()) например,
df.with_columns(
delta = pl.col("value").diff(1).over("id", pl.col("value").is_not_null())
)
┌─────┬───────┬───────┐
│ id ┆ value ┆ delta │
│ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 │
╞═════╪═══════╪═══════╡
│ a ┆ 10 ┆ null │
│ a ┆ null ┆ null │
│ a ┆ 30 ┆ 20 │
│ b ┆ 5 ┆ null │
│ b ┆ 10 ┆ 5 │
│ b ┆ null ┆ null │
│ b ┆ null ┆ null │
│ b ┆ 40 ┆ 30 │
└─────┴───────┴───────┘
Подробнее здесь: [url]https://stackoverflow.com/questions/77098968/how-to-ignore-previous-nulls-when-using-diff-or-shift-in-polars[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия