我正在使用一个深度嵌套的DataFrame(我知道这不是一个好的实践),我想表达类似于"为列表Y中的所有 struct Select 字段X"的意思.

数据 struct 的一个例子:

import polars as pl

data = {
    "a": [
        [{
            "x": [1, 2, 3],
            "y": [4, 5, 6]
        },
        {
            "x": [2, 3, 4],
            "y": [3, 4, 5]
        }
        ]
    ],
}
df = pl.DataFrame(data)

在本例中,我想在两个 struct 中 Select 字段"x",并将它们聚集成一个带有两个系列的df,分别称为"x_1"和"x_2".

换句话说,期望输出是:

┌───────────┬───────────┐
│ x_1       ┆ x_2       │
│ ---       ┆ ---       │
│ list[i64] ┆ list[i64] │
╞═══════════╪═══════════╡
│ [1, 2, 3] ┆ [2, 3, 4] │
└───────────┴───────────┘

我不知道列表的长度提前,我希望动态地执行这个任务(即不对字段名称进行硬编码).我不确定这是否可能使用Polars表达式?

提前感谢!

推荐答案

df.select(
   pl.col("a").list.eval(pl.element().struct["x"])
     .list.to_struct("max_width", lambda idx: f"x_{idx + 1}")
).unnest("a")
shape: (1, 2)
┌───────────┬───────────┐
│ x_1       ┆ x_2       │
│ ---       ┆ ---       │
│ list[i64] ┆ list[i64] │
╞═══════════╪═══════════╡
│ [1, 2, 3] ┆ [2, 3, 4] │
└───────────┴───────────┘

解释

  • .list.eval()循环遍历每个list元素,我们提取每个struct字段.
df.select(
   pl.col("a").list.eval(pl.element().struct["x"])
)

# shape: (1, 1)
# ┌────────────────────────┐
# │ a                      │
# │ ---                    │
# │ list[list[i64]]        │
# ╞════════════════════════╡
# │ [[1, 2, 3], [2, 3, 4]] │
# └────────────────────────┘
  • .list.to_struct()转换成一个 struct ,它允许我们把每个内部列表变成它自己的列.
df.select(
   pl.col("a").list.eval(pl.element().struct["x"])
     .list.to_struct("max_width", lambda idx: f"x_{idx + 1}")
)

# shape: (1, 1)
# ┌───────────────────────┐
# │ a                     │
# │ ---                   │
# │ struct[2]             │
# ╞═══════════════════════╡
# │ {[1, 2, 3],[2, 3, 4]} │
# └───────────────────────┘

Python相关问答推荐

如何从FDaGrid实例中删除某些函数?

Locust请求中的Python和参数

通过优化空间在Python中的饼图中添加标签

运行总计基于多列pandas的分组和总和

如何在Windows上用Python提取名称中带有逗号的文件?

删除所有列值,但判断是否存在任何二元组

在Mac上安装ipython

Python中绕y轴曲线的旋转

PyQt5,如何使每个对象的 colored颜色 不同?'

Stacked bar chart from billrame

Odoo 16使用NTFS使字段只读

将scipy. sparse矩阵直接保存为常规txt文件

如何使用matplotlib查看并列直方图

如果不使用. to_list()[0],我如何从一个pandas DataFrame中获取一个值?

如何在SQLAlchemy + Alembic中定义一个"Index()",在基表中的列上

Polars表达式无法访问中间列创建表达式

极点用特定值替换前n行

是否将Pandas 数据帧标题/标题以纯文本格式转换为字符串输出?

无法使用请求模块从网页上抓取一些产品的名称

try 在单个WITH_COLUMNS_SEQ操作中链接表达式时,使用Polars数据帧时出现ComputeError