我有一个包含列、部门和员工计数的 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”。
您可以交换列表中的列以及
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
虽然晚了 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