如何在Polars中计算数值列的横向中位数
如何在Polars中计算数值列的横向中位数
我明白你的需求——Polars目前确实没有内置的median_horizontal函数,不过我们可以用行级的列表操作来实现和mean_horizontal逻辑一致的横向中位数计算,而且同样会自动忽略空值。
这里有个最直接的纯Polars方案,不需要依赖其他库:
result = df.with_columns( # 把每行的Int64列打包成列表,再计算列表的中位数 pl.concat_list(pl.col(pl.Int64)).list.median().alias("Horizontal Median") ) print(result)
执行后会得到以下结果:
shape: (3, 5) ┌─────┬─────┬──────┬─────┬──────────────────┐ │ ABC ┆ A ┆ B ┆ C ┆ Horizontal Median│ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ i64 ┆ f64 │ ╞═════╪═════╪══════╪═════╪══════════════════╡ │ foo ┆ 1 ┆ 2 ┆ 1 ┆ 1.0 │ │ bar ┆ 2 ┆ 1 ┆ 2 ┆ 2.0 │ │ foo ┆ 3 ┆ null ┆ 3 ┆ 3.0 │ └─────┴─────┴──────┴─────┴──────────────────┘
方案说明:
pl.concat_list(pl.col(pl.Int64)):把每行中所有Int64类型的列值打包成一个列表,自动跳过空值(和mean_horizontal的空值处理逻辑完全一致).list.median():对每行的列表单独计算中位数,完美匹配你需要的横向统计逻辑
如果之后你需要更灵活的自定义处理(比如特殊空值规则),也可以用结构体结合map_elements实现(需要依赖pandas),不过上面的纯Polars方案已经足够满足你的需求,而且性能更优。
备注:内容来源于stack exchange,提问作者miroslaavi
相关产品推荐
相关产品推荐

