iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
AI & Data

資料三十-那些最基本的資料處理與分析技能系列 第 12

【Day12-排序】淺談python中的資料排序——sort, sorted, natsort, pd.sort_values

前一天我們學會了對資料進行簡單的map處理之後,今天來聊一下排序
不論是進行人工的檢視或是後續分析的需求,排序是一個我們會很常到的工具

排序

在python中最簡單的排序可以透過呼叫sorted(要排序的list)來進行

對單一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差在哪裡?

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]

sort()是直接在原list排序(所以沒有回傳)

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']

without自然排序——字串按照字典順序

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——自然排序

由於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']

DataFrame排序

剛好最近剛爬完學校公佈的成績分佈,就拿這個當作範例好了

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])

參考資料


上一篇
【Day11-映射】淺談python的map與pandas的map用法
下一篇
【Day13-計數】如何快速統計資料出現頻率?——使用Counter或groupby快速計算元素出現個數
系列文
資料三十-那些最基本的資料處理與分析技能30

尚未有邦友留言

立即登入留言