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

用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:50:55