如何结合键函数对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
相关产品推荐
相关产品推荐

