Imagine que tenho um conjunto de dados como:
data = {
"a": [1, 4, 2, 4, 7, 4],
"b": [4, 2, 3, 3, 0, 2],
"c": ["a", "b", "c", "d", "e", "f"],
}
e quero manter apenas as linhas a + b
descritas exclusivamente por uma única combinação de a
e b
. Eu consegui hackear isso:
df = (
pl.DataFrame(data)
.with_columns(sum_ab=pl.col("a") + pl.col("b"))
.group_by("sum_ab")
.agg(pl.col("a"), pl.col("b"), pl.col("c"))
.filter(
(pl.col("a").list.unique().list.len() == 1)
& (pl.col("b").list.unique().list.len() == 1)
)
.explode(["a", "b", "c"])
.select("a", "b", "c")
)
"""
shape: (2, 3)
┌─────┬─────┬─────┐
│ a ┆ b ┆ c │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ str │
╞═════╪═════╪═════╡
│ 4 ┆ 2 ┆ b │
│ 4 ┆ 2 ┆ f │
└─────┴─────┴─────┘
"""
Alguém pode sugerir uma maneira melhor de conseguir o mesmo? Lutei um pouco para descobrir essa lógica, então imagino que exista uma maneira mais direta/elegante de obter o mesmo resultado.
.struct()
combinara
eb
em uma coluna para que possamos verificar a exclusividade.n_unique()
para verificar a exclusividade.over()
para limitar o cálculo a ficar dentro dea + b
.Se você precisar estendê-lo para um número maior de colunas, poderá usá-lo
sum_horizontal()
para torná-lo mais genérico:A partir de
Você pode usar an
over
para simplificar o group_by e explode, caso contrário, isso não é muito diferente. Ele também usapl.all_horizontal
em vez&
de um gerador (para que você possa adicionar facilmente mais colunas).Uma observação: isso trataria 2+4 e 4+2 como combinações únicas, mas não sei se isso é pretendido.