Path: blob/main/py-polars/tests/unit/operations/namespaces/test_struct.py
6940 views
from __future__ import annotations12import datetime3from collections import OrderedDict45import pytest67import polars as pl8from polars.exceptions import (9ColumnNotFoundError,10)11from polars.testing import assert_frame_equal121314def test_struct_various() -> None:15df = pl.DataFrame(16{"int": [1, 2], "str": ["a", "b"], "bool": [True, None], "list": [[1, 2], [3]]}17)18s = df.to_struct("my_struct")1920assert s.struct.fields == ["int", "str", "bool", "list"]21assert s[0] == {"int": 1, "str": "a", "bool": True, "list": [1, 2]}22assert s[1] == {"int": 2, "str": "b", "bool": None, "list": [3]}23assert s.struct.field("list").to_list() == [[1, 2], [3]]24assert s.struct.field("int").to_list() == [1, 2]25assert s.struct["list"].to_list() == [[1, 2], [3]]26assert s.struct["int"].to_list() == [1, 2]2728for s, expected_name in (29(df.to_struct(), ""),30(df.to_struct("my_struct"), "my_struct"),31):32assert s.name == expected_name33assert_frame_equal(s.struct.unnest(), df)34assert s.struct._ipython_key_completions_() == s.struct.fields353637def test_rename_fields() -> None:38df = pl.DataFrame({"int": [1, 2], "str": ["a", "b"], "bool": [True, None]})39s = df.to_struct("my_struct").struct.rename_fields(["a", "b"])40assert s.struct.fields == ["a", "b"]414243def test_struct_json_encode() -> None:44assert pl.DataFrame(45{"a": [{"a": [1, 2], "b": [45]}, {"a": [9, 1, 3], "b": None}]}46).with_columns(pl.col("a").struct.json_encode().alias("encoded")).to_dict(47as_series=False48) == {49"a": [{"a": [1, 2], "b": [45]}, {"a": [9, 1, 3], "b": None}],50"encoded": ['{"a":[1,2],"b":[45]}', '{"a":[9,1,3],"b":null}'],51}525354def test_struct_json_encode_logical_type() -> None:55df = pl.DataFrame(56{57"a": [58{59"a": [datetime.date(1997, 1, 1)],60"b": [datetime.datetime(2000, 1, 29, 10, 30)],61"c": [datetime.timedelta(1, 25)],62}63]64}65).select(pl.col("a").struct.json_encode().alias("encoded"))66assert df.to_dict(as_series=False) == {67"encoded": ['{"a":["1997-01-01"],"b":["2000-01-29 10:30:00"],"c":["PT86425S"]}']68}697071def test_map_fields() -> None:72df = pl.DataFrame({"x": {"a": 1, "b": 2}})73assert df.schema == OrderedDict([("x", pl.Struct({"a": pl.Int64, "b": pl.Int64}))])74df = df.select(pl.col("x").name.map_fields(lambda x: x.upper()))75assert df.schema == OrderedDict([("x", pl.Struct({"A": pl.Int64, "B": pl.Int64}))])767778def test_prefix_suffix_fields() -> None:79df = pl.DataFrame({"x": {"a": 1, "b": 2}})8081prefix_df = df.select(pl.col("x").name.prefix_fields("p_"))82assert prefix_df.schema == OrderedDict(83[("x", pl.Struct({"p_a": pl.Int64, "p_b": pl.Int64}))]84)8586suffix_df = df.select(pl.col("x").name.suffix_fields("_f"))87assert suffix_df.schema == OrderedDict(88[("x", pl.Struct({"a_f": pl.Int64, "b_f": pl.Int64}))]89)909192def test_struct_alias_prune_15401() -> None:93df = pl.DataFrame({"a": []}, schema={"a": pl.Struct({"b": pl.Int8})})94assert df.select(pl.col("a").alias("c").struct.field("b")).columns == ["b"]959697def test_empty_list_eval_schema_5734() -> None:98df = pl.DataFrame({"a": [[{"b": 1, "c": 2}]]})99assert df.filter(False).select(100pl.col("a").list.eval(pl.element().struct.field("b"))101).schema == {"a": pl.List(pl.Int64)}102103104def test_field_by_index_18732() -> None:105df = pl.DataFrame({"foo": [{"a": 1, "b": 2}, {"a": 2, "b": 1}]})106107# illegal upper bound108with pytest.raises(ColumnNotFoundError):109df.filter(pl.col.foo.struct[2] == 1)110111# legal112expected_df = pl.DataFrame({"foo": [{"a": 1, "b": 2}]})113result_df = df.filter(pl.col.foo.struct[0] == 1)114assert_frame_equal(expected_df, result_df)115116expected_df = pl.DataFrame({"foo": [{"a": 2, "b": 1}]})117result_df = df.filter(pl.col.foo.struct[-1] == 1)118assert_frame_equal(expected_df, result_df)119120121