在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
相关产品推荐
相关产品推荐

