在數據處理中,排序是最常用的操作之一。通過排序,我們可以快速找到數據中的最大值、最小值,或者按照特定規律組織數據,便於後續分析。pandas作爲Python中強大的數據處理庫,提供了sort_values函數來實現數據排序。本文將從基礎到實戰,帶大家一步步掌握這個函數的使用。
一、爲什麼需要排序?¶
想象你有一份學生成績表,包含姓名、語文、數學、英語成績。如果想知道誰的語文成績最好,直接查看原始數據可能需要逐行對比。但如果用sort_values對語文成績排序,結果會直接按分數從高到低排列,一目瞭然。
二、sort_values函數基礎¶
sort_values的核心作用是對DataFrame或Series按照指定列的值進行排序。它的基本語法如下:
df.sort_values(by, ascending=True, inplace=False, axis=0)
參數說明:
- by:必填,指定排序的列名(或列名列表)。
- ascending:可選,排序方向。True(默認)爲升序,False爲降序。若按多列排序,可傳入列表(如[True, False])。
- inplace:可選,是否直接修改原DataFrame。False(默認)返回新排序後的DataFrame,不改變原數據;True則直接修改原數據。
- axis:可選,排序方向。0(默認)按行排序,1按列排序(較少使用,初學者可暫不深入)。
三、基礎排序示例¶
我們先用一個簡單的學生成績表作爲示例數據:
import pandas as pd
# 創建示例數據
data = {
'姓名': ['張三', '李四', '王五', '趙六'],
'語文': [85, 76, 90, 88],
'數學': [92, 85, 78, 95],
'英語': [78, 90, 82, 89]
}
df = pd.DataFrame(data)
1. 單列升序排序¶
按“語文”成績從小到大排序(升序):
sorted_df = df.sort_values(by='語文') # 按語文成績升序,默認ascending=True
print(sorted_df)
輸出結果:
姓名 語文 數學 英語
1 李四 76 85 90
0 張三 85 92 78
3 趙六 88 95 89
2 王五 90 78 82
可以看到,“李四”(76分)的語文成績最低,排在最前面;“王五”(90分)最高,排在最後。
2. 單列降序排序¶
按“數學”成績從大到小排序(降序):
sorted_df = df.sort_values(by='數學', ascending=False) # ascending=False表示降序
print(sorted_df)
輸出結果:
姓名 語文 數學 英語
3 趙六 88 95 89
0 張三 85 92 78
1 李四 76 85 90
2 王五 90 78 82
“趙六”(95分)數學成績最高,排在第一位;“王五”(78分)最低,排在最後。
四、多列排序¶
當某列值相同時,可按另一列的值繼續排序。例如,先按“語文”成績升序,若語文成績相同,再按“數學”成績降序:
sorted_df = df.sort_values(by=['語文', '數學'], ascending=[True, False])
print(sorted_df)
輸出結果:
姓名 語文 數學 英語
1 李四 76 85 90
0 張三 85 92 78
3 趙六 88 95 89
2 王五 90 78 82
解釋:
- 先按“語文”升序:張三(85)、趙六(88)、王五(90)中,李四(76)最低排在第一。
- 語文成績相同時(這裏沒有重複),按“數學”降序(但本例中語文成績無重複,結果不變)。
五、修改原數據(inplace參數)¶
默認情況下,sort_values不會修改原DataFrame,而是返回一個新的排序後DataFrame。若需直接修改原數據,可設置inplace=True:
df.sort_values(by='英語', ascending=False, inplace=True) # 直接修改df
print(df) # 原df已被修改
注意:inplace=True可能導致原數據被覆蓋,建議優先使用默認inplace=False以保留原數據。
六、實戰案例:按總分排序¶
假設需要分析學生的綜合成績,可先計算“總分”,再按總分降序排序:
# 新增“總分”列
df['總分'] = df['語文'] + df['數學'] + df['英語']
# 按總分降序排序
sorted_df = df.sort_values(by='總分', ascending=False)
print(sorted_df)
輸出結果:
姓名 語文 數學 英語 總分
3 趙六 88 95 89 272
0 張三 85 92 78 255
1 李四 76 85 90 251
2 王五 90 78 82 250
可以看到,“趙六”總分最高(272分),“王五”總分最低(250分)。
七、總結與注意事項¶
- 核心參數:
by指定排序列,ascending控制方向,inplace決定是否修改原數據。 - 多列排序:
by和ascending均可傳入列表,需注意列表長度一致。 - 數據安全:優先使用
inplace=False(默認),避免意外修改原數據。 - 進階操作:結合
reset_index(drop=True)可重置排序後的索引(如df.sort_values(...).reset_index(drop=True))。
通過以上示例,你已經掌握了sort_values的基本用法和實戰技巧。排序是數據處理的基礎技能,後續分析(如TopN、分組統計)常需依賴排序結果。多練習不同場景(如單列、多列、降序、inplace),就能熟練應用了!