如何在Polars中基于字典列表创建保留键名的Series?
解决方案
要在Polars中创建保留字典键名的struct类型Series并添加到已有DataFrame,有两种可靠实现方式:
方法1:Polars原生构造
通过pl.struct()将每个字典显式转换为带字段名的struct对象,再构造Series:
import polars as pl data = [ {"MA5": 91.128, "MA10": 95.559, "MA20": 103.107, "MA30": 109.3803, "MA60": 114.0822}, {"MA5": 13.776, "MA10": 14.027, "MA20": 13.768, "MA30": 13.6417, "MA60": 14.0262} ] # 创建保留键名的struct Series ma_series = pl.Series("ma", [pl.struct(d) for d in data]) # 添加到已有DataFrame(假设已有DataFrame名为df) df = df.with_columns(ma_series)
方法2:借助PyArrow构造
利用Polars与PyArrow的兼容性,先定义struct类型并转换数组,再生成Series:
import polars as pl import pyarrow as pa data = [ {"MA5": 91.128, "MA10": 95.559, "MA20": 103.107, "MA30": 109.3803, "MA60": 114.0822}, {"MA5": 13.776, "MA10": 14.027, "MA20": 13.768, "MA30": 13.6417, "MA60": 14.0262} ] # 定义带字段名的PyArrow struct类型 struct_type = pa.struct([ ("MA5", pa.float64()), ("MA10", pa.float64()), ("MA20", pa.float64()), ("MA30", pa.float64()), ("MA60", pa.float64()) ]) # 转换为PyArrow数组并生成Polars Series pa_array = pa.array(data, type=struct_type) ma_series = pl.Series("ma", pa_array) # 添加到已有DataFrame df = df.with_columns(ma_series)
关键说明
之前丢失键名是因为直接将字典列表传入pl.Series时,Polars默认将字典转为无字段名的匿名struct。通过上述两种方式显式指定struct的字段结构,就能完整保留原字典的键名信息。
验证后输出的Series格式如下:
Series: 'ma' [struct[5]] [ {MA5: 91.128, MA10: 95.559, MA20: 103.107, MA30: 109.3803, MA60: 114.0822} {MA5: 13.776, MA10: 14.027, MA20: 13.768, MA30: 13.6417, MA60: 14.0262} ]
内容的提问来源于stack exchange,提问作者letit
相关产品推荐
相关产品推荐

