考虑以下玩具示例:
import polars as pl
xs = pl.DataFrame(
[
pl.Series(
"date",
["2024 Jan", "2024 Feb", "2024 Jan", "2024 Jan"],
dtype=pl.String,
)
]
)
ys = (
xs.with_columns(
pl.col("date").str.split(" ").list.to_struct(fields=["year", "month"]),
)
.with_columns(
pl.col("date").struct.with_fields(pl.field("year").cast(pl.Int16()))
)
.unnest("date")
)
ys
shape: (4, 2)
┌──────┬───────┐
│ year ┆ month │
│ --- ┆ --- │
│ i16 ┆ str │
╞══════╪═══════╡
│ 2024 ┆ Jan │
│ 2024 ┆ Feb │
│ 2024 ┆ Jan │
│ 2024 ┆ Jan │
└──────┴───────┘
我认为对一系列独特的日期数据进行操作会更有效率(我可以使用map_dict
,但我选择这样做join
没有什么好理由):
unique_dates = (
pl.DataFrame([xs["date"].unique()])
.with_columns(
pl.col("date")
.str.split(" ")
.list.to_struct(fields=["year", "month"])
.alias("struct_date")
)
.with_columns(
pl.col("struct_date").struct.with_fields(
pl.field("year").cast(pl.Int16())
)
)
)
unique_dates
shape: (2, 2)
┌──────────┬──────────────┐
│ date ┆ struct_date │
│ --- ┆ --- │
│ str ┆ struct[2] │
╞══════════╪══════════════╡
│ 2024 Jan ┆ {2024,"Jan"} │
│ 2024 Feb ┆ {2024,"Feb"} │
└──────────┴──────────────┘
zs = (
xs.join(unique_dates, on="date", left_on="date", right_on="struct_date")
.drop("date")
.rename({"struct_date": "date"})
.unnest("date")
)
zs
shape: (4, 2)
┌──────┬───────┐
│ year ┆ month │
│ --- ┆ --- │
│ i16 ┆ str │
╞══════╪═══════╡
│ 2024 ┆ Jan │
│ 2024 ┆ Feb │
│ 2024 ┆ Jan │
│ 2024 ┆ Jan │
└──────┴───────┘
我该怎么做才能进一步提高此操作的效率?我polars
是否足够习惯使用?
.str.splitn()
应该更有效率,因为它避免了List
创建 +.list.to_struct()
.struct.field()
也可以用于直接“解除嵌套”字段。