有没有一种两极原生的方式来水平分解一列列表?

例如,从这个开始:

df = pl.DataFrame(
    {
        "letters": ["a", "a", "b", "c"],
        "numbers": [[1, 1], [2, 3], [4, 5], [6, 7]],
    }
)

对这件事?

df = pl.DataFrame(
    {
        "letters": ["a", "a", "b", "c"],
        "numbers_a": [1, 2, 4, 6],
        "numbers_b": [1, 3, 5, 7]
    }
)

我知道.explode()%的方法,但AFAIK这只可能垂直使用

推荐答案

有两种方法可以做到这一点.

struct /取消嵌套

最简单的是先到.list.to_struct,然后是unnest

from string import ascii_lowercase

(
    df
    .with_columns(
        pl.col('numbers').list.to_struct(
            fields=lambda idx: f"numbers_{ascii_lowercase[idx]}",
            n_field_strategy='max_width'
            )
        )
    .unnest('numbers')
)

到达

from string import ascii_lowercase
max_width=df['numbers'].list.len().max()
(
    df
    .select(
        pl.exclude('numbers'), 
        *[pl.col('numbers').list.到达(x).alias(f"numbers_{ascii_lowercase[x]}") 
          for x in range(max_width)]
        )
    )

无论是哪种情况,您都会得到:

shape: (4, 3)
┌─────────┬───────────┬───────────┐
│ letters ┆ numbers_a ┆ numbers_b │
│ ---     ┆ ---       ┆ ---       │
│ str     ┆ i64       ┆ i64       │
╞═════════╪═══════════╪═══════════╡
│ a       ┆ 1         ┆ 1         │
│ a       ┆ 2         ┆ 3         │
│ b       ┆ 4         ┆ 5         │
│ c       ┆ 6         ┆ 7         │
└─────────┴───────────┴───────────┘

在前一种情况下,您可以更容易地链接方法,但第二种情况依赖于首先确定max_width,这不太灵活.第二种方法might性能更好,但我不是很确定,所以值得一试.

Python-3.x相关问答推荐

math. gcd背后的算法是什么,为什么它是更快的欧几里得算法?

使用Python装载. iso文件

如何使用 Selenium Python 连续单击一个按钮直到另一个元素出现?

Django中自动设置/更新字段

PyTest:尽管明确运行了测试,但是被标记为没有运行测试

如何使用 Selenium 和 Python 作为线程来使用事件(Chrome-Developer-Tools)?

在 pytest 中,如何测试 sys.exit('some error message')?

正则表达式来识别用 Python 写成单词的数字?

合并问卷中多列中的稀疏问题 - Pandas

在python中循环处理时并行写入文件

在两个数据框之间查找相等的列

如何确定一个类的元类?

Python 解包运算符 (*)

如何在 Python3 中添加带有标志的命令行参数?

在计算之前删除包含某些值的组合

使用 Python3 与 HDFS 交互的最佳模块是什么?

__cause__ 和 __context__ 有什么区别?

PIL 在图像上绘制半透明方形覆盖

Python 3.4 多处理队列比 Pipe 快,出乎意料

Python 2 与 Python 3 - urllib 格式