如何对Pandas DataFrame按两列整体排序而非先后排序?
问题:按两列z-Score的最大值排序DataFrame
原始DataFrame
Client Number (#) Volume ($) Num. z-Score Vol. z-Score 0 ABC 63 131.22 1.17 0.68 1 DEF 44 98.71 2.68 1.35 2 JKL 17 64.15 0.45 0.57 3 PQR 75 180.47 0.88 1.43 4 XYZ 28 75.93 0.23 3.96
需求
需要将上述DataFrame按最后两列(Num. z-Score、Vol. z-Score)中任意一列的最大值排序:每行取这两个z-Score的最大值,按该值降序排列,不优先指定某一列。
现有方法的局限性
使用df.sort_values(['Num. z-Score','Vol. z-Score'], ascending=False)时,会优先按Num. z-Score排序,仅当该列值相等时才参考Vol. z-Score,无法满足“任意一列最大值优先”的需求。
目标排序结果
Client Number (#) Volume ($) Num. z-Score Vol. z-Score 4 XYZ 28 75.93 0.23 3.96 1 DEF 44 98.71 2.68 1.35 3 PQR 75 180.47 0.88 1.43 0 ABC 63 131.22 1.17 0.68 2 JKL 17 64.15 0.45 0.57
(注:原目标结果中PQR的Vol. z-Score存在笔误,此处修正为原始数据的1.43以保证逻辑自洽)
解决方案
核心思路是先计算每行两个z-Score的最大值,再以此为依据排序:
# 1. 新增临时列存储每行两个z-Score的最大值 df['max_z_score'] = df[['Num. z-Score', 'Vol. z-Score']].max(axis=1) # 2. 按最大值降序排序,排序后删除临时列 df_sorted = df.sort_values('max_z_score', ascending=False).drop('max_z_score', axis=1) # 查看最终结果 print(df_sorted)
说明
max(axis=1)用于按行计算指定列的最大值,确保每行的排序依据是两列z-Score中的较大值- 排序完成后通过
drop()删除临时列,保持结果DataFrame的结构与原始一致
内容的提问来源于stack exchange,提问作者vicefreak04
相关产品推荐
相关产品推荐

