Eu tenho um dataframe como:
data = {
"a": [[1], [2], [3, 4], [5, 6, 7]],
"b": [[], [8], [9, 10], [11, 12]],
}
df = pl.DataFrame(data)
"""
┌───────────┬───────────┐
│ a ┆ b │
│ --- ┆ --- │
│ list[i64] ┆ list[i64] │
╞═══════════╪═══════════╡
│ [1] ┆ [] │
│ [2] ┆ [8] │
│ [3, 4] ┆ [9, 10] │
│ [5, 6, 7] ┆ [11, 12] │
└───────────┴───────────┘
"""
Cada par de listas pode não ter o mesmo comprimento, e eu quero "truncar" a explosão para a menor das duas listas:
"""
┌─────┬─────┐
│ a ┆ b │
│ --- ┆ --- │
│ i64 ┆ i64 │
╞═════╪═════╡
│ 2 ┆ 8 │
│ 3 ┆ 9 │
│ 4 ┆ 10 │
│ 5 ┆ 11 │
│ 6 ┆ 12 │
└─────┴─────┘
"""
Eu estava pensando que talvez eu tivesse que preencher o menor de ambas as listas com None
para combinar ambos os comprimentos, e então drop_nulls
. Mas eu estava pensando se havia uma abordagem mais direta para isso?
Aqui está uma abordagem:
Saída:
Explicação
Expr.list.len
e obtenha o menor para cada linha compl.min_horizontal
.min_length == 0
(df.filter
) e dentrodf.with_columns
selecione os primeiros n valores de cada lista comExpr.list.head
.df.explode
.Não consigo colocar nos comentários, então vou colocar outra resposta aqui, pois é um pouco mais genérica para o exemplo dado: