Tenho um Polars DataFrame e quero criar uma visualização resumida onde valores agregados (por exemplo, IDs exclusivos, envios totais) são exibidos em um formato que facilita a comparação entre meses. Aqui está um exemplo do meu conjunto de dados:
Meu exemplo de dataframe:
import polars as pl
df = pl.DataFrame({
"Channel": ["X", "X", "Y", "Y", "X", "X", "Y", "Y", "X", "X", "Y", "Y", "X", "X", "Y", "Y"],
"ID": ["a", "b", "b", "a", "e", "b", "g", "h", "a", "a", "k", "a", "b", "n", "o", "p"],
"Month": ["1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2"]
})
Atualmente, uso a seguinte group_by()
abordagem para calcular o número de IDs exclusivos e o número total de envios para cada mês e canal:
(
df
.group_by(
pl.col("Month"),
pl.col("Channel")
)
.agg(
pl.col("ID").n_unique().alias("Uniques ID"),
pl.col("ID").len().alias("Total sends")
)
)
shape: (4, 4)
┌───────┬─────────┬────────────┬─────────────┐
│ Month ┆ Channel ┆ Uniques ID ┆ Total sends │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ str ┆ u32 ┆ u32 │
╞═══════╪═════════╪════════════╪═════════════╡
│ 1 ┆ X ┆ 3 ┆ 4 │
│ 1 ┆ Y ┆ 4 ┆ 4 │
│ 2 ┆ X ┆ 3 ┆ 4 │
│ 2 ┆ Y ┆ 3 ┆ 4 │
└───────┴─────────┴────────────┴─────────────┘
No entanto, meu conjunto de dados real é muito maior e tem mais agg_functions, então eu quero um formato que destaque melhor as comparações entre meses. Idealmente, eu quero que a saída fique assim:
| Channels | agg_func | months | months |
|----------|--------------|--------|--------|
| | | 1 | 2 |
| X | Uniques ID | 3 | 3 |
| X | Total sends | 4 | 4 |
| Y | Uniques ID | 4 | 3 |
| Y | Total sends | 4 | 4 |
Acredito que eu poderia usar .pivot()
e passar as funções de agregação como parte do índice. Mas, não tenho certeza de como implementar isso diretamente sem criar um DataFrame auxiliar. Alguma sugestão?
Você pode agregar vários agregados durante a rotação e, em seguida, explodir as listas:
Ou você pode fazer isso com vários pivôs (um por função agregada):
Claro, você também pode estender sua solução com
unpivot
epivot