digamos que eu tenha esse dataframe polar
df = pl.DataFrame(
{
"group_col": ["g1", "g1", "g2"],
"b": [1, 2, 3],
"c": [4, 5, 6]
}
)
saída
shape: (3, 3)
┌───────────┬─────┬─────┐
│ group_col ┆ b ┆ c │
│ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 │
╞═══════════╪═════╪═════╡
│ g1 ┆ 1 ┆ 4 │
│ g1 ┆ 2 ┆ 5 │
│ g2 ┆ 3 ┆ 6 │
└───────────┴─────┴─────┘
eu preciso fazer um grupo assim:
df.group_by("group_col").agg(
[
pl.col("c").filter((pl.col("b") >= 1) & (pl.col('b').max() == pl.col('b'))).max().alias("gte"),
]
)
saída:
shape: (2, 2)
┌───────────┬─────┐
│ group_col ┆ gte │
│ --- ┆ --- │
│ str ┆ i64 │
╞═══════════╪═════╡
│ g1 ┆ 5 │
│ g2 ┆ 6 │
└───────────┴─────┘
neste caso, por que o valor da coluna gte do grupo g1 não é nulo? dado o & (pl.col('b').max() == pl.col('b'))
filtro?
Qualquer que seja o group_by, limita o que o agg vê apenas ao que está em cada grupo.
Experimente isto:
Como você pode ver, para o grupo g1, o cmax é 5 porque é o máximo no contexto desse grupo. Então, quando você obtém gte como 5 para g1, é porque a coluna b está no máximo 2 para esse grupo.
Parece que o que você quer é algo como:
mas você deseja que g1 seja retornado com um valor nulo. Para conseguir isso, você teria que configurar um df com suas linhas padrão e, em seguida, juntar o resultado anterior ao resultado anterior, como:
A primeira
.max()
comparação precisa ser feita no nível da “coluna”, não no nível do “grupo”: