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

例如,从这个开始:

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相关问答推荐

我们可以在每个可以使用 Pandas Join 的用例中使用 Pandas merge 吗?

如何创建与导航抽屉一起使用的导航栏

计算文档中所有关键字(单词和多词)出现的频率

如何统计一个值连续出现的次数?

Keras 中 Conv2D 层的意外结果

如何通过 GitLab V4 api 列出 gitlab 项目中的所有项目变量

numpy是如何添加@运算符的?

如何在python 3.10中将列表项(字符串类型)转换为模块函数

集合操作:应该只适用于集合,但适用于 dict_keys?

获取以特定字母开头的姓氏

Dask worker post-processing

Python:获取未绑定的类方法

二进制文件的 Python 3 和 base64 编码

无法在 macOS 上的 Anaconda3 python3.6 上安装 OpenCV3

Pandas 的 EMA 与股票的 EMA 不匹配?

无论如何我可以在 Google colaboratory 中下载文件吗?

用于 unicode 大写单词的 Python 正则表达式

Python 3 中的连接列表

没有名为urlparse的模块,但我没有使用 urlparse

为什么异步库比这个 I/O 绑定操作的线程慢?