You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 10:59:58