Pandas:根据多列对数据框进行排序

问题描述 投票:0回答:2

我有一个包含列、部门和员工计数的 pandas 数据框。我需要按降序对employee_count 列进行排序。但如果 2 个员工计数之间存在联系,则应根据部门按字母顺序对它们进行排序。

   Department Employee_Count
0    abc          10
1    adc          10
2    bca          11
3    cde          9
4    xyz          15

所需输出:

   Department Employee_Count
0    xyz          15
1    bca          11
2    abc          10
3    adc          10
4    cde          9

这是我尝试过的。

df = df.sort_values(['Department','Employee_Count'],ascending=[True,False])

但这只是按字母顺序对部门进行排序。

我还尝试先按部门排序,然后按 Employee_Count 排序。像这样:

df = df.sort_values(['Department'],ascending=[True])
df = df.sort_values(['Employee_Count'],ascending=[False])

这也没有给我正确的输出:

   Department Employee_Count
4    xyz          15
2    bca          11
1    adc          10
0    abc          10
3    cde          9

它首先给出“adc”,然后给出“abc”。

python-3.x pandas dataframe sorting group-by
2个回答
17
投票

您可以交换列表中的列以及

ascending
参数中的值:

解释

列名称的顺序是排序的顺序,首先按

Employee_Count
降序排序,如果
Employee_Count
中存在重复项,则按
Department
升序排序仅重复行。

df1 = df.sort_values(['Employee_Count', 'Department'], ascending=[False, True])
print (df1)
  Department  Employee_Count
4        xyz              15
2        bca              11
0        abc              10 <-
1        adc              10 <-
3        cde               9

或者进行测试,如果使用第二个

False
,则重复的行正在排序
descending

df2 = df.sort_values(['Employee_Count', 'Department',],ascending=[False, False])
print (df2)
  Department  Employee_Count
4        xyz              15
2        bca              11
1        adc              10 <-
0        abc              10 <-
3        cde               9

0
投票

虽然晚了 4 年,但如果排序稳定的话,OP 的最初尝试就会成功。 Pandas

sort_values()
默认使用
'quicksort'
,但不保证稳定。但是,如果第二个
sort_values()
调用使用
'stable'
排序,它将产生预期的输出。

df = df.sort_values('Department', ascending=True)
df = df.sort_values('Employee_Count', kind='stable', ascending=False, ignore_index=True)
#                                     ^^^^^^^^^^^^^  <--- stable sort here

您可以验证对于任何数据帧,它都会产生与按两列列表排序相同的结果:

df = pd.DataFrame(np.random.randint(10, size=(1000, 2)), columns=['A', 'B'])
a = df.sort_values('A', ascending=True).sort_values('B', kind='stable', ascending=False, ignore_index=True)
b = df.sort_values(['B', 'A'], ascending=[False, True], ignore_index=True)
a.equals(b)   # True
© www.soinside.com 2019 - 2024. All rights reserved.