如何在Polars DataFrame中拆分列表列元素并生成对应新列
解决方案
针对你的Polars DataFrame处理需求,可通过以下步骤将列表内的每个地址字符串拆分后转为多列:
完整代码实现
import polars as pl # 初始化原始DataFrame df = pl.DataFrame({ 'combine_address': [ ["Yes|#456 Lane|Apt#4|ABC|VA|50566", "Yes|#456 Lane|Apt#4|ABC|VA|50566", "No|#456 Lane|Apt#4|ABC|VA|50566"], ["No|#8495|APT#94|SWE|WA|43593", "No|#8495|APT#94|SWE|WA|43593", "Yes|#8495|APT#94|SWE|WA|43593"] ] }) # 链式处理:展开列表→拆分字符串→重命名列 result_df = df.with_columns( pl.col("combine_address") .list.to_struct() .unnest() .select( [ pl.col(f"field_{i}") .str.split("|") .list.to_struct() .unnest() .rename({f"field_{j}": f"addr_{i}_part_{j}" for j in range(6)}) for i in range(df["combine_address"].list.len().max()) ] ) ) # 查看结果 print(result_df)
代码说明
- 展开列表列:通过
list.to_struct()将combine_address的列表元素转为结构体,再用unnest()展开为单独的字符串列(如field_0、field_1)。 - 拆分并展开子列:对每个展开后的字符串列,用
str.split("|")拆分出6个部分,再次转为结构体并展开,同时通过rename()给子列赋予清晰命名(如addr_0_part_0表示第1个列表元素的第1部分)。 - 动态适配列表长度:用
df["combine_address"].list.len().max()获取列表的最大长度,确保不管列表有3个还是5个元素,都能自动生成对应数量的拆分列(3个元素生成18列,5个元素生成30列)。
输出示例
最终结果会生成18列,部分列数据如下:
| addr_0_part_0 | addr_0_part_1 | addr_2_part_0 | addr_2_part_5 |
|---|---|---|---|
| Yes | #456 Lane | No | 50566 |
| No | #8495 | Yes | 43593 |
内容的提问来源于stack exchange,提问作者myamulla_ciencia
相关产品推荐
相关产品推荐

