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

Мне нужно найти первое ненулевое значение в столбце над сгруппированным pl.DataFrame.

import polars as pl

df = pl.DataFrame(
    {
        "symbol": ["s1", "s1", "s2", "s2"],
        "trade": [None, 1, -1, None],
    }
)

shape: (4, 2)
┌────────┬───────┐
│ symbol ┆ trade │
│ ---    ┆ ---   │
│ str    ┆ i64   │
╞════════╪═══════╡
│ s1     ┆ null  │
│ s1     ┆ 1     │
│ s2     ┆ -1    │
│ s2     ┆ null  │
└────────┴───────┘

Как я могу получить номера строк/значения индексов первого ненулевого значения в столбцах trade, пока group_by symbol?

На самом деле я ищу номера строк/индексов 1 и 0. Возможно, результат может быть примерно таким:

shape: (2, 2)
┌────────┬────────────────┐
│ symbol ┆ first-non-null │
│ ---    ┆ ---            │
│ str    ┆ i64            │
╞════════╪════════════════╡
│ s1     ┆ 1              │
│ s2     ┆ 0              │
└────────┴────────────────┘

На самом деле я ищу эквивалент pd.first_valid_index()

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот один из способов использования .arg_true().first():

print(
    df.group_by("symbol").agg(
        pl.col("trade").is_not_null().arg_true().first().alias("first-non-null")
    )
)

Выход:

┌────────┬────────────────┐
│ symbol ┆ first-non-null │
│ ---    ┆ ---            │
│ str    ┆ u32            │
╞════════╪════════════════╡
│ s1     ┆ 1              │
│ s2     ┆ 0              │
└────────┴────────────────┘

Очень элегантный подход!

Hericks 26.08.2024 21:18

Дополнительный вопрос: мне нужно утверждать, что значения в исходном кадре данных в этих позициях в каждой группе отличны от нуля. В моем примере это будет равно True.

Andi 27.08.2024 09:32

Может быть, проще работать со столбцом списка? df.group_by("symbol").agg(pl.col("trade"))

Andi 27.08.2024 10:20
assert df.group_by("symbol").agg(pl.col("trade")).with_columns(firs‌​t=pl.col("trade").li‌​st.first()).filter(p‌​l.col("first") == 0).is_empty()
Andi 27.08.2024 10:56
(df.group_by("symbol")
   .agg(pl.col.trade.is_not_null().arg_max())
)
shape: (2, 2)
┌────────┬───────┐
│ symbol ┆ trade │
│ ---    ┆ ---   │
│ str    ┆ u32   │
╞════════╪═══════╡
│ s2     ┆ 0     │
│ s1     ┆ 1     │
└────────┴───────┘

Гарантированно ли arg_max возвращает первый индекс максимального значения? Я не вижу, чтобы это было явно задокументировано на docs.pola.rs/api/python/dev/reference/expressions/api/… но, возможно, это задокументировано где-то еще.

Dogbert 26.08.2024 21:56

Другие вопросы по теме