Как указать тип данных столбцаPython

Программы на Python
Anonymous
Как указать тип данных столбца

Сообщение Anonymous »

У меня есть следующий код:

Код: Выделить всё

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(num):
events.append(Event("name", "description"))
return events

data = {"events": [1, 2]}
df = pl.DataFrame(data).select(events=pl.col("events").map_elements(event_table))

"""
shape: (2, 1)
┌───────────────────────────────────┐
│ events                            │
│ ---                               │
│ list[struct[2]]                   │
╞═══════════════════════════════════╡
│ [{"name","description"}]          │
│ [{"name","description"}, {"name"… │
└───────────────────────────────────┘
"""
Но если первый список пуст, я получаю список[list[str]] вместо списка[struct[2]], который мне нужен :

Код: Выделить всё

data = {"events": [0, 1, 2]}
df = pl.DataFrame(data).select(events=pl.col("events").map_elements(event_table))
print(df)

"""
shape: (3, 1)
┌───────────────────────────────────┐
│ events                            │
│ ---                               │
│ list[list[str]]                   │
╞═══════════════════════════════════╡
│ []                                │
│ [["name", "description"]]         │
│ [["name", "description"], ["name… │
└───────────────────────────────────┘
"""
Я попробовал использовать return_dtype функции map_elements, например:

Код: Выделить всё

data = {"events": [0, 1, 2]}
df = pl.DataFrame(data).select(
events=pl.col("events").map_elements(
event_table,
return_dtype=pl.List(pl.Struct({"name": pl.String, "description": pl.String})),
)
)
но это не удалось:

Код: Выделить всё

Traceback (most recent call last):
File "script.py", line 18, in 
df = pl.DataFrame(data).select(
^^^^^^^^^^^^^^^^^^^^^^^^^^
File ".venv/lib/python3.11/site-packages/polars/dataframe/frame.py", line 8193, in select
return self.lazy().select(*exprs, **named_exprs).collect(_eager=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File ".venv/lib/python3.11/site-packages/polars/lazyframe/frame.py", line 1943, in collect
return wrap_df(ldf.collect())
^^^^^^^^^^^^^
polars.exceptions.SchemaError: expected output type 'List(Struct([Field { name: "name", dtype: String }, Field { name: "description", dtype: String }]))', got 'List(List(String))'; set `return_dtype` to the proper datatype
Как заставить это работать? мне нужно, чтобы тип этого столбца был событием list[struct[2]], если первый список пуст.

Подробнее здесь: https://stackoverflow.com/questions/782 ... -data-type

Вернуться в «Python»