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

在Polars列应用scipy.trim_mean报错,求原因及替代计算方法

问题解答

为什么触发IndexError?

scipy.stats.trim_mean只认numpy数组、Python列表这类实际数值集合,但pl.col("x")是Polars的列表达式对象,不是直接的数据集。直接把表达式塞给trim_mean,函数根本识别不了这种特殊对象,自然会抛出索引错误。

Polars列的数据类型

你示例里df["x"]的数据类型是Int64(64位整数),想确认的话跑这行代码就行:

print(df.schema)
# 输出:{'x': Int64}

在Polars中计算截尾均值的方法

方法1:用map_elements调用scipy的trim_mean

通过map_elements把列的数值集合自动转成numpy数组,再传给trim_mean:

from scipy.stats import trim_mean
import polars as pl

df = pl.DataFrame({
    "x": [1, 2, 3, 4, 6, 8, 5, 9, 12, 15, 4, 6]
})

result = df.select(
    pl.col("x").map_elements(lambda s: trim_mean(s, 0.05)).alias("trim_mean")
)

print(result)

方法2:手动实现截尾逻辑(不用依赖scipy)

用Polars原生表达式搞定:先排序,算出要截断的元素数量,取中间部分求均值,性能还更好:

trim_ratio = 0.05
result = df.select(
    pl.col("x")
    .sort()
    .slice(round(len(df)*trim_ratio), round(len(df)*(1-2*trim_ratio)))
    .mean()
    .alias("trim_mean")
)

print(result)

方法3:提取列数据为numpy数组后计算

先把Polars列转成numpy数组,再喂给trim_mean:

trimmed_mean = trim_mean(df["x"].to_numpy(), 0.05)
result = pl.DataFrame({"trim_mean": [trimmed_mean]})

print(result)

内容的提问来源于stack exchange,提问作者Joel Schafer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:57:09