Мне нужно найти первое ненулевое значение в столбце над сгруппированным 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()
Вот один из способов использования .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 │
└────────┴────────────────┘
Дополнительный вопрос: мне нужно утверждать, что значения в исходном кадре данных в этих позициях в каждой группе отличны от нуля. В моем примере это будет равно True
.
Может быть, проще работать со столбцом списка? df.group_by("symbol").agg(pl.col("trade"))
assert df.group_by("symbol").agg(pl.col("trade")).with_columns(first=pl.col("trade").list.first()).filter(pl.col("first") == 0).is_empty()
(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/… но, возможно, это задокументировано где-то еще.
Очень элегантный подход!