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

如何结合键函数对Pandas DataFrame多列自定义排序?

Pandas多列自定义排序实现方案

问题背景

已有可正常运行的Pandas单列排序代码:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'col1': ['A', 'A', 'B', np.nan, 'D', 'C'],
    'col2': [2, -1, 9, -8, 7, 4],
    'col3': [0, 1, 9, 4, 2, 3],
    'col4': ['a', 'B', 'c', 'D', 'e', 'F'],
    'col5': [2, 1, 9, 8, 7, 4],
    'col6': [1.00005,1.00001,-2.12132, -2.12137,1.00003,-2.12135]
})

print(df)

print(df.sort_values(by=['col5']))

print(df.sort_values(by=['col2']))

print(df.sort_values(by='col2', key=lambda col: col.abs() ))

现在需要按col6、col5两列排序,满足两个条件:

  • col6仅保留4位小数进行比较(例如1.00005与1.00001视为相等)
  • col6按绝对值大小比较(例如1.00005小于-2.12132)

预期输出:

col1  col2  col3 col4  col5     col6
1    A    -1     1    B     1  1.00001
0    A     2     0    a     2  1.00005
4    D     7     2    e     7  1.00003
5    C     4     3    F     4 -2.12135
3  NaN    -8     4    D     8 -2.12137
2    B     9     9    c     9 -2.12132

实现代码

通过给sort_values的key参数传入字典,为每一列单独定义排序转换规则,即可实现需求:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'col1': ['A', 'A', 'B', np.nan, 'D', 'C'],
    'col2': [2, -1, 9, -8, 7, 4],
    'col3': [0, 1, 9, 4, 2, 3],
    'col4': ['a', 'B', 'c', 'D', 'e', 'F'],
    'col5': [2, 1, 9, 8, 7, 4],
    'col6': [1.00005,1.00001,-2.12132, -2.12137,1.00003,-2.12135]
})

# 执行多列自定义排序
sorted_df = df.sort_values(
    by=['col6', 'col5'],
    key={
        'col6': lambda col: col.round(4).abs(),  # 先保留4位小数,再取绝对值作为排序依据
        'col5': lambda col: col  # col5按默认升序规则排序
    }
)

print(sorted_df)

关键逻辑说明

  • Pandas的sort_values函数支持key参数为字典,键是排序列名,值是对应列的转换函数,排序时会用转换后的值进行比较
  • 对col6的处理:先用round(4)把数值四舍五入到4位小数,消除微小差异;再用abs()取绝对值,实现按绝对值大小排序
  • col5直接使用原始数值,保持默认的升序排序逻辑

执行上述代码后,输出结果与预期完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:35:56