前一天我們學會了對資料進行簡單的map處理之後,今天來聊一下排序
不論是進行人工的檢視或是後續分析的需求,排序是一個我們會很常到的工具
在python中最簡單的排序可以透過呼叫sorted(要排序的list)
來進行
A = [1,3,5,1,2]
sorted(A)
輸出:
[1, 1, 2, 3, 5]
A = [1,3,5,1,2]
sorted(A,reverse=True)
輸出:
[5, 3, 2, 1, 1]
如果傳入的資料是tuple
類型的,就會先按照第1個元素比較大小進行排序,如果相同的時候則會比較第二個,更多個元素的時候以此類推
B = [("Alice",100), ("Bob", 97), ("Carol", 97), ("Bob", 95) ]
sorted(B)
輸出:
[('Alice', 100), ('Bob', 95), ('Bob', 97), ('Carol', 97)]
因此這邊我們可以發現這筆資料先按照了人名排序,而相同是Bob的地方則是再從分數小的排到大
這邊使用lambda
函式來取出每個元素的第[1]
個元素來比較(100,97,97,95)
# 指定排序元素
B = [("Alice",100), ("Bob", 97), ("Carol", 97), ("Bob", 95) ]
sorted(B,key=lambda x: x[1]) # x為list內每個元素,依照x[1]的元素進行比較
輸出:
[('Bob', 95), ('Bob', 97), ('Carol', 97), ('Alice', 100)]
# 指定排序規則
C = ["Alice", "Bob", "Bob", "Bob", "Carol"]
sorted(C,key=len) # 依照長度進行排序
輸出:
['Bob', 'Bob', 'Bob', 'Alice', 'Carol']
.sort()
和sorted
差在哪裡?A = [1,3,5,1,2]
B = sorted(A)
print("A:", A)
print("B:", B)
A: [1, 3, 5, 1, 2]
B: [1, 1, 2, 3, 5]
A = [1,3,5,1,2]
B = A.sort()
print("A:", A)
print("B:", B)
A: [1, 1, 2, 3, 5]
B: None
我們這邊先建立一個字串list作為測試
A = ["file"+str(x) for x in range(15)]
A
['file0',
'file1',
'file2',
'file3',
'file4',
'file5',
'file6',
'file7',
'file8',
'file9',
'file10',
'file11',
'file12',
'file13',
'file14']
sorted(A)
['file0',
'file1',
'file10',
'file11',
'file12',
'file13',
'file14',
'file2',
'file3',
'file4',
'file5',
'file6',
'file7',
'file8',
'file9']
我們發現這邊它先排了1開頭的10, 11, ..., 14,才排2,3,4...
這似乎和我們想要達成的依照數字排序有點不同
由於natsort
不是內建的package,我們需要先進行安裝
這邊可以使用pip來進行安裝
pip install natsort
from natsort import natsorted
natsorted(A)
['file0',
'file1',
'file2',
'file3',
'file4',
'file5',
'file6',
'file7',
'file8',
'file9',
'file10',
'file11',
'file12',
'file13',
'file14']
剛好最近剛爬完學校公佈的成績分佈,就拿這個當作範例好了
import pandas as pd
df = pd.read_excel("GPA.xlsx")
df
sort_values
df.sort_values("平均值")
by=["欄位1","欄位2"]
df.sort_values(by= ["標準差", "平均值"])
ascending=["欄位1","欄位2"]
df.sort_values(by= ["標準差", "平均值"], ascending=[True, False])