从极坐标中的结构中删除一个字段

问题描述 投票:0回答:1

我想从结构体中删除一个字段,目前我是这样设置的,但是有没有更简单的方法来实现这一点?

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))

# Example usage
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_"} │
└─────┴───────────┘

结构体中的字段类似于

select

python python-polars
1个回答
0
投票

您可以使用

field()
接受多个字符串。您知道您的 DataFrame'
schema()
,因此您可以轻松创建所需的字段列表

fields = [c[0] for c in input_df.schema["meta_data"] if c[0] != "system_data"]

input_df.with_columns(
    meta_data = pl.struct(
        pl.col.meta_data.struct.field(fields)
    )
)

┌─────┬───────────┐
│ id  ┆ meta_data │
│ --- ┆ ---       │
│ i64 ┆ struct[1] │
╞═════╪═══════════╡
│ 1   ┆ {"keep"}  │
│ 2   ┆ {"keep_"} │
└─────┴───────────┘
© www.soinside.com 2019 - 2024. All rights reserved.