如何将Polars聚合sum的结果提取为float数值?
提取Polars聚合结果中的单个数值
问题场景
使用列表推导式对Polars DataFrame的子集行计算Price列总和时,得到的是1行1列的DataFrame对象(如下所示),无法直接用于后续数值计算,尝试直接添加.item()或转换为float均失败:
ca = [df.filter((pl.col('Created') <= datum[j]) & (pl.col('Year') == jaar[j])).select(pl.sum('Price')) for j in range(aantaljaren)]
示例返回结果:
shape: (1, 1) ┌──────────┐ │ Price │ │ --- │ │ f64 │ ╞══════════╡ │ 75395.84 │ └──────────┘
解决方案
问题核心是select(pl.sum('Price'))返回的是DataFrame对象,而非单个数值。需要将聚合结果转换为Scalar后提取数值,以下是几种可行写法:
方法1:提取Series后聚合取值
直接获取目标列的Series,求和后用.item()提取数值:
ca = [ df.filter((pl.col('Created') <= datum[j]) & (pl.col('Year') == jaar[j]))['Price'] .sum() .item() for j in range(aantaljaren) ]
- 逻辑:
df.filter(...)['Price']得到Price列的Series,.sum()返回Polars Scalar对象,.item()直接提取对应float数值。
方法2:从DataFrame中按坐标取值
如果保留select写法,可通过指定坐标提取单元格值:
ca = [ df.filter((pl.col('Created') <= datum[j]) & (pl.col('Year') == jaar[j])) .select(pl.sum('Price')) .item((0, 0)) # 指定第0行第0列的单元格 for j in range(aantaljaren) ]
也可先转为Series再取值:.to_series()[0].item(),效果一致。
方法3:使用agg聚合后取值
用agg替代select,同样通过坐标提取数值:
ca = [ df.filter((pl.col('Created') <= datum[j]) & (pl.col('Year') == jaar[j])) .agg(pl.sum('Price')) .item((0, 0)) for j in range(aantaljaren) ]
效果验证
修改后ca列表中的每个元素均为float类型(如ca[3] = 75395.84),可直接用于后续数值计算。
内容的提问来源于stack exchange,提问作者Stefaan Dumez
相关产品推荐
相关产品推荐

