Найдите индекс первого ненулевого значения в столбце в фрейме данных 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 был создан Гвидо ван Россумом и впервые выпущен в 1991 году.


2
50
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              │
└────────┴────────────────┘

(df.group_by("symbol")
   .agg(pl.col.trade.is_not_null().arg_max())
)
shape: (2, 2)
┌────────┬───────┐
│ symbol ┆ trade │
│ ---    ┆ ---   │
│ str    ┆ u32   │
╞════════╪═══════╡
│ s2     ┆ 0     │
│ s1     ┆ 1     │
└────────┴───────┘