如果我的问题没有多大意义,很抱歉.我对Python 没有太多的经验.

我有一些代码,如下所示:

import polars as pl
from typing import NamedTuple


class Event(NamedTuple):
    name: str
    description: str


def event_table(num) -> list[Event]:
    events = []
    for i in range(5):
        events.append(Event("name", "description"))
    return events


def pretty_string(events: list[Event]) -> str:
    pretty = ""
    for event in events:
        pretty += f"{event.name}: {event.description}\n"
    return pretty

# This does work
print(pretty_string(event_table(5)))

# But then it doesn't work if I have my `list[Event]` in a dataframe
data = {"events": [0, 1, 2, 3, 4]}
df = pl.DataFrame(data).select(events=pl.col("events").map_elements(event_table))

# This doesn't work
pretty_df = df.select(events=pl.col("events").map_elements(pretty_string))
print(pretty_df)

# Neither does this
print(pretty_string(df["events"][0]))

它失败,并出现错误:

Traceback (most recent call last):
  File "path/to/script.py", line 32, in <module>
    pretty_df = df.select(events=pl.col("events").map_elements(pretty_string))
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "path/to/.venv/lib/python3.11/site-packages/polars/dataframe/frame.py", line 8116, in select
    return self.lazy().select(*exprs, **named_exprs).collect(_eager=True)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "path/to/.venv/lib/python3.11/site-packages/polars/lazyframe/frame.py", line 1934, in collect
    return wrap_df(ldf.collect())
                   ^^^^^^^^^^^^^
polars.exceptions.ComputeError: AttributeError: 'dict' object has no attribute 'name'

看来我的list[Event]已经不在df里面了.我不知道该如何让它工作.

推荐答案

可以通过传递return_dtype=pl.Object来保留Event对象

df.select(pl.col("events").map_elements(event_table))
shape: (5, 1)
┌───────────────────────────────────┐
│ events                            │
│ ---                               │
│ list[struct[2]]                   │
╞═══════════════════════════════════╡
│ [{"name","description"}, {"name"… │
│ [{"name","description"}, {"name"… │
│ [{"name","description"}, {"name"… │
│ [{"name","description"}, {"name"… │
│ [{"name","description"}, {"name"… │
└───────────────────────────────────┘
df.select(pl.col("events").map_elements(event_table, return_dtype=pl.Object))
shape: (5, 1)
┌───────────────────────────────────┐
│ events                            │
│ ---                               │
│ object                            │
╞═══════════════════════════════════╡
│ [Event(name='name', description=… │
│ [Event(name='name', description=… │
│ [Event(name='name', description=… │
│ [Event(name='name', description=… │
│ [Event(name='name', description=… │
└───────────────────────────────────┘

Python相关问答推荐

TARete错误:类型对象任务没有属性模型'

由于NEP 50,向uint 8添加-256的代码是否会在numpy 2中失败?

抓取rotowire MLB球员新闻并使用Python形成表格

通过Selenium从页面获取所有H2元素

什么相当于pytorch中的numpy累积ufunc

数据抓取失败:寻求帮助

Godot:需要碰撞的对象的AdditionerBody2D或Area2D以及queue_free?

在vscode上使用Python虚拟环境时((env))

根据列值添加时区

当递归函数的返回值未绑定到变量时,非局部变量不更新:

如何在表中添加重复的列?

如果初始groupby找不到满足掩码条件的第一行,我如何更改groupby列,以找到它?

如何在达到end_time时自动将状态字段从1更改为0

在极点中读取、扫描和接收有什么不同?

Autocad使用pyautocad/comtypes将对象从一个图形复制到另一个图形

当输入是字典时,`pandas. concat`如何工作?

Python协议不兼容警告

如何从一个维基页面中抓取和存储多个表格?

Python:在cmd中添加参数时的语法

Pandas:新列,从列表中采样,基于列值