在數據處理中,排序是最常用的操作之一。通過排序,我們可以快速找到數據中的最大值、最小值,或者按照特定規律組織數據,便於後續分析。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分)。

七、總結與注意事項

  1. 核心參數by指定排序列,ascending控制方向,inplace決定是否修改原數據。
  2. 多列排序byascending均可傳入列表,需注意列表長度一致。
  3. 數據安全:優先使用inplace=False(默認),避免意外修改原數據。
  4. 進階操作:結合reset_index(drop=True)可重置排序後的索引(如df.sort_values(...).reset_index(drop=True))。

通過以上示例,你已經掌握了sort_values的基本用法和實戰技巧。排序是數據處理的基礎技能,後續分析(如TopN、分組統計)常需依賴排序結果。多練習不同場景(如單列、多列、降序、inplace),就能熟練應用了!

小夜