You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:32:35