如何将pandas DataFrame按两列一起排序,而不是先一列再另一列



假设我有一个数据帧df,如下所示:

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

我想对它进行排序,使最后两列中任意一列的最大值显示为第一行。由于z-Score跟踪SD与平均值的偏差,我正在寻找我的两个指标(数量、体积(中任何一个的最大偏差,我宁愿不优先考虑它们。

例如,我使用的当前方法: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
0    ABC       63            131.22        1.17            0.68
3    PQR       75            180.47        0.88            1.03
2    JKL       17            64.15         0.45            0.57

如有任何帮助,我们将不胜感激:(

使用DataFrame.sort_index,两列最大值为:

df = df.sort_index(key=df[['Vol. z-Score','Num. z-Score']].max(axis=1).get, ascending=False)
print (df)
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

Series.argsort和负值按降序排列的替代解决方案:

df = df.iloc[(-df[['Vol. z-Score','Num. z-Score']].max(axis=1)).argsort()]
print (df)
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

看起来您正试图找到'Num。z-Score和Vol。z-Score’。

df['max_value'] = df[['Num. z-Score','Vol. z-Score']].max(axis=1)
df.sort_values(['max_value'], ascending=False)

最新更新