如何在Polars中移除结构体(struct)字段?求更简便实现方法
移除Polars DataFrame结构体字段的更简便方法
我需要移除结构体(struct)中的一个字段,目前已通过以下代码实现该功能,但想了解是否有更简便的实现方式,比如能否直接对结构体内部字段执行类似select的操作?
import polars as pl import polars.selectors as cs def remove_one_field(df: pl.DataFrame) -> pl.DataFrame: meta_data_columns = (df.select('meta_data') .unnest('meta_data') .select(cs.all() - cs.by_name('system_data')).columns) print(meta_data_columns) return (df.unnest('meta_data') .select(cs.all() - cs.by_name('system_data')) .with_columns(meta_data=pl.struct(meta_data_columns)) .drop(meta_data_columns)) # 示例使用 input_df = pl.DataFrame({ "id": [1, 2], "meta_data": [{"system_data": "to_remove", "user_data": "keep"}, {"user_data": "keep_"}] }) output_df = remove_one_field(input_df) print(output_df)
运行结果:
['user_data'] shape: (2, 2) ┌─────┬───────────┐ │ id ┆ meta_data │ │ --- ┆ --- │ │ i64 ┆ struct[1] │ ╞═════╪═══════════╡ │ 1 ┆ {"keep"} │ │ 2 ┆ {"keep_"} │ └─────┴───────────┘
Polars本身提供了直接操作结构体内部字段的API,不需要先拆再重组,一行代码就能完成需求,两种常用方式如下:
方式1:用struct.exclude()移除指定字段
直接指定要删除的结构体字段,逻辑清晰:
import polars as pl def remove_one_field_simpler(df: pl.DataFrame) -> pl.DataFrame: return df.with_columns( meta_data=pl.col("meta_data").struct.exclude("system_data") )
方式2:用struct.select()保留指定字段
如果明确知道要保留的字段,直接选择更直观:
import polars as pl def remove_one_field_select(df: pl.DataFrame) -> pl.DataFrame: return df.with_columns( meta_data=pl.col("meta_data").struct.select("user_data") )
两种方式的运行结果和你原来的代码完全一致,但省去了拆结构体、提取列名、重新组合的繁琐步骤,直接对结构体字段做操作,代码更简洁高效。
内容的提问来源于stack exchange,提问作者apostofes
相关产品推荐
相关产品推荐

