Estou tentando usar polars
dataframe onde gostaria de selecionar a linha first
e last
por grupo. Aqui está um exemplo simples selecionando a primeira linha por grupo:
import polars as pl
df = pl.DataFrame(
{
"a": [1, 2, 2, 3, 4, 5],
"b": [0.5, 0.5, 4, 10, 14, 13],
"c": [True, True, True, False, False, True],
"d": ["Apple", "Apple", "Apple", "Banana", "Banana", "Banana"],
}
)
result = df.group_by("d", maintain_order=True).first()
print(result)
Saída:
shape: (2, 4)
┌────────┬─────┬──────┬───────┐
│ d ┆ a ┆ b ┆ c │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ f64 ┆ bool │
╞════════╪═════╪══════╪═══════╡
│ Apple ┆ 1 ┆ 0.5 ┆ true │
│ Banana ┆ 3 ┆ 10.0 ┆ false │
└────────┴─────┴──────┴───────┘
Isso funciona bem e podemos usar .last
para fazer isso na última fileira. Mas como podemos combinar essas duas em uma group_by
?
Como colunas
Você pode usar
agg
, você terá que adicionar umsuffix
(ouprefix
) para diferenciar os nomes das colunas:Saída:
Como linhas
Se você quiser várias linhas, precisará
concat
:Saída:
Ou usando
filter
comint_range
+over
:Saída:
As soluções do @mozway funcionam bem! Para completar, eu também queria compartilhar duas soluções que dependem de
pl.Expr.gather
.Em um contexto selecionado
Em um contexto de agrupamento por
Considerações sobre desempenho
Também executei cronometragem preliminar desses métodos (no pequeno conjunto de dados de exemplo).
group_by
+concat
filter
group_by
+gather
select
+gather
Existem métodos dedicados de primeiro/último.
.is_first_distinct()
.is_last_distinct()
Você pode usar uma struct se o identificador do grupo tiver várias colunas.