用Pythonic方式定位Polars DataFrame绝对值排序后值的行列位置
更Pythonic的Polars实现方案
原代码依赖numpy转换与循环查找,不仅效率偏低,还存在重复值匹配错误的问题(比如原数据中b、c的val2均为2.0,原代码会错误地都映射到b)。以下是完全基于Polars原生API的简洁实现:
实现代码
import polars as pl df = pl.DataFrame({ "name": ["a", "b", "c", "d", "e", "f"], "val1": [1.2, -2.3, 3, -3.3, 2.2, -1.3], "val2": [5, 2, 2, -4, -3, -6] }) new_df = ( df # 将宽表转为窄表,每个数值对应一行,保留name、列名和值 .melt(id_vars="name", variable_name="col", value_name="val") # 按值的绝对值降序排序 .sort(pl.col("val").abs(), descending=True) # 调整列顺序为需求的val、name、col .select("val", "name", "col") ) print(new_df)
输出结果
shape: (12, 3) ┌──────┬──────┬──────┐ │ val ┆ name ┆ col │ │ --- ┆ --- ┆ --- │ │ f64 ┆ str ┆ str │ ╞══════╪══════╪══════╡ │ -6.0 ┆ f ┆ val2 │ │ 5.0 ┆ a ┆ val2 │ │ -4.0 ┆ d ┆ val2 │ │ -3.3 ┆ d ┆ val1 │ │ 3.0 ┆ c ┆ val1 │ │ -3.0 ┆ e ┆ val2 │ │ 2.2 ┆ e ┆ val1 │ │ -2.3 ┆ b ┆ val1 │ │ 2.0 ┆ b ┆ val2 │ │ 2.0 ┆ c ┆ val2 │ │ -1.3 ┆ f ┆ val1 │ │ 1.2 ┆ a ┆ val1 │ └──────┴──────┴──────┘
方案优势
- 原生高效:全程使用Polars内置操作,避免数据类型转换与循环遍历,性能更优
- 逻辑清晰:链式调用直观表达数据流转过程,代码可读性强
- 结果准确:完整保留所有原始数据行,不会出现重复值匹配错误
内容的提问来源于stack exchange,提问作者beta green
相关产品推荐
相关产品推荐

