我想从结构体中删除一个字段,目前我是这样设置的,但是有没有更简单的方法来实现这一点?
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
?
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_"} │
└─────┴───────────┘