Pandas 排序
排序是資料分析中常見的操作,Pandas 提供了按值排序和按索引排序的方法。
範例資料
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
'age': [25, 30, 35, 28, 30],
'salary': [50000, 60000, 70000, 55000, 65000]
}, index=['e', 'b', 'a', 'd', 'c'])
sort_values():按值排序
單一欄位排序
# 按 age 升冪排序(預設)
df_sorted = df.sort_values('age')
print(df_sorted)
name age salary
e Alice 25 50000
d David 28 55000
b Bob 30 60000
c Eva 30 65000
a Charlie 35 70000
降冪排序
df_sorted = df.sort_values('age', ascending=False)
多欄位排序
先按 age 排序,age 相同時再按 salary 排序:
df_sorted = df.sort_values(['age', 'salary'])
各欄位不同排序方向
# age 升冪,salary 降冪
df_sorted = df.sort_values(['age', 'salary'], ascending=[True, False])
空值的處理
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'age': [25, None, 35]
})
# 空值放最後(預設)
df_sorted = df.sort_values('age', na_position='last')
# 空值放最前
df_sorted = df.sort_values('age', na_position='first')
sort_index():按索引排序
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'age': [25, 30, 35]
}, index=['c', 'a', 'b'])
# 按索引排序
df_sorted = df.sort_index()
print(df_sorted)
name age
a Bob 30
b Charlie 35
c Alice 25
# 降冪排序
df_sorted = df.sort_index(ascending=False)
原地排序
預設情況下,排序會回傳新的 DataFrame,不會修改原本的資料。如果要原地排序:
df.sort_values('age', inplace=True)
但一般建議避免使用 inplace,改用賦值的方式:
df = df.sort_values('age')
重設索引
排序後索引順序會被打亂,如果需要連續的索引:
df_sorted = df.sort_values('age').reset_index(drop=True)
Series 排序
s = pd.Series([3, 1, 4, 1, 5], index=['a', 'b', 'c', 'd', 'e'])
# 按值排序
s_sorted = s.sort_values()
# 按索引排序
s_sorted = s.sort_index()
取得排序後的前 N 名
nlargest():最大的 N 個
# salary 最高的 3 筆
top3 = df.nlargest(3, 'salary')
nsmallest():最小的 N 個
# age 最小的 3 筆
youngest3 = df.nsmallest(3, 'age')
這比先排序再取前 N 個更有效率。
排名
如果只需要排名而不需要實際排序:
df['rank'] = df['salary'].rank(ascending=False)
排序欄位順序
# 重新排列欄位順序
df = df[['name', 'salary', 'age']]
# 按欄位名稱字母順序排列
df = df.reindex(sorted(df.columns), axis=1)
自訂排序
如果需要按照自訂的順序排序(例如:「高」、「中」、「低」):
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'level': ['中', '高', '低']
})
# 定義順序
order = {'高': 1, '中': 2, '低': 3}
# 建立排序用的欄位
df['level_order'] = df['level'].map(order)
# 排序後刪除輔助欄位
df_sorted = df.sort_values('level_order').drop('level_order', axis=1)
或使用 Categorical 型別:
df['level'] = pd.Categorical(df['level'], categories=['高', '中', '低'], ordered=True)
df_sorted = df.sort_values('level')