使用 Python Pandas 按顺序对值进行排序

Sort value in order with Python Pandas

提问人:Adam CHEN 提问时间:10/28/2023 最后编辑:Adam CHEN 更新时间:10/30/2023 访问量:54

问:

我有一个数据帧如下:

持械 signs_of_mental_illness 计数
628
155
142
车辆 104
84
金属杆 1
金属耙 1

我想按如下方式对这个数据帧进行排序:

持械 signs_of_mental_illness 计数
628
155
142
84

我累了

armed_mental = focus_age_group.groupby(['armed', 'signs_of_mental_illness'])['id'].count().sort_values(ascending=False)

有高于结果的产品。但我很难得到我想要的。具有最高数字(True + False)的类别(armed)应位于数据帧的顶部。然后是 True 和 False。

Python Pandas DataFrame 数据科学

评论


答:

1赞 mozway 10/28/2023 #1

如果要按每个“armed”的总数排序,y 首先需要将计数与 groupby.transform 组合:

import numpy as np

order = np.lexsort([df['signs_of_mental_illness'],
                    -df.groupby('armed')['count'].transform('sum')])

out = df.iloc[order]

另类:

out = (df.assign(total=df.groupby('armed')['count'].transform('sum'))
         .sort_values(by=['total', 'signs_of_mental_illness'], 
                      ascending=[False, True])
         .drop(columns='total')
       )

输出:

        armed  signs_of_mental_illness  count
0         gun                    False    628
1         gun                     True    155
2       knife                    False    142
4       knife                     True     84
3     vehicle                    False    104
5  metal pole                     True      1
6  metal rake                     True      1
0赞 Rabia Naz 10/30/2023 #2

您可以通过指定用于排序的多个列来使用该方法实现所需的排序。在您的情况下,您应该首先根据“armed”列按降序对数据帧进行排序,以便在每个“armed”类别的顶部获得最高计数。接下来,按“signs_of_mental_illness”列降序排序(“False”之前为“True”)。最后,按“计数”列降序排序。sort_values

下面是基于上述解释的代码:

sorted_dataframe = your_dataframe.sort_values(by=['armed', 'signs_of_mental_illness', 'count'], ascending=[False, False, False])

因此,排序后的数据帧将显示如下:

     armed      signs_of_mental_illness  count
0    gun                 False            628
1    gun                 True             155
2    knife               False            142
4    knife               True             84
3    vehicle             False            104
6    metal pole          True             1
7    metal rake          True             1