我有一个像这样的数据框:
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] │
└───────────┴───────────┘
"""
每对列表的长度可能不一样,我想将爆炸“截断”为两个列表中最短的一个:
"""
┌─────┬─────┐
│ a ┆ b │
│ --- ┆ --- │
│ i64 ┆ i64 │
╞═════╪═════╡
│ 2 ┆ 8 │
│ 3 ┆ 9 │
│ 4 ┆ 10 │
│ 5 ┆ 11 │
│ 6 ┆ 12 │
└─────┴─────┘
"""
我在想,也许我必须用 填充两个列表中最短的列表以None
匹配两个长度,然后drop_nulls
。但我想知道是否有更直接的方法可以解决这个问题?
以下是一种方法:
输出:
解释
Expr.list.len
并使用 获取每行的最短列表pl.min_horizontal
。min_length == 0
现在,过滤出(df.filter
)中的行,并df.with_columns
用 选择每个列表的前 n 个值Expr.list.head
。df.explode
。我无法将其挤在评论中,因此我只能在这里提供另一个答案,因为对于给定的示例来说它更为通用: