Pandas DataFrame中兩種排序函數(shù)的使用
一、排序的核心函數(shù):sort_values()和sort_index()
DataFrame 的排序主要依賴兩個核心函數(shù),先明確它們的定位:
| 函數(shù) | 核心作用 | 適用場景 |
|---|---|---|
| sort_values() | 按列的值排序(最常用) | 按分?jǐn)?shù)、日期、金額等業(yè)務(wù)字段排序 |
| sort_index() | 按行 / 列索引排序 | 按行標(biāo)簽(如學(xué)號、日期)或列名排序 |
通用參數(shù)(兩個函數(shù)都支持)
| 參數(shù) | 作用 | 常用值 |
|---|---|---|
| ascending | 升序 / 降序 | True(升序,默認(rèn))/False(降序) |
| inplace | 是否修改原 DataFrame | False(返回新對象,默認(rèn))/True(原地修改) |
| na_position | 缺失值(NaN)的位置 | last(默認(rèn),放最后)/first(放最前) |
| ignore_index | 是否重置行索引(0,1,2...) | False(保留原索引,默認(rèn))/True(重置) |
二、核心排序:按列值排序(sort_values())
這是實戰(zhàn)中最常用的排序方式,支持單列、多列、自定義排序規(guī)則。
1. 單列排序(基礎(chǔ))
import pandas as pd
import numpy as np
# 構(gòu)建示例數(shù)據(jù)(學(xué)生成績)
data = {
"姓名": ["小明", "小紅", "小剛", "小麗", "小強"],
"班級": ["1班", "2班", "1班", "2班", "1班"],
"數(shù)學(xué)": [85, 92, 78, 90, np.nan], # 含缺失值
"語文": [92, 88, 80, 85, 90]
}
df = pd.DataFrame(data, index=["stu01", "stu02", "stu03", "stu04", "stu05"])
print("原始DataFrame:")
print(df)
# 1.1 按「數(shù)學(xué)」列升序排序(默認(rèn))
df_sort_math_asc = df.sort_values(by="數(shù)學(xué)")
print("\n按數(shù)學(xué)升序排序(缺失值放最后):")
print(df_sort_math_asc)
# 1.2 按「數(shù)學(xué)」列降序排序,缺失值放最前
df_sort_math_desc = df.sort_values(by="數(shù)學(xué)", ascending=False, na_position="first")
print("\n按數(shù)學(xué)降序排序(缺失值放最前):")
print(df_sort_math_desc)
# 1.3 原地排序(修改原DataFrame)+ 重置行索引
df.sort_values(by="語文", ascending=False, inplace=True, ignore_index=True)
print("\n按語文降序原地排序(重置索引):")
print(df)關(guān)鍵說明:
by="列名"是必傳參數(shù),指定排序依據(jù)的列;na_position僅對含NaN的列有效,默認(rèn)last(缺失值放最后);ignore_index=True會將排序后的行索引重置為0,1,2...,避免原索引混亂。
2. 多列排序(進(jìn)階)
按多個列依次排序(先按第一列,第一列值相同則按第二列),適用于 “分組排序” 場景。
import pandas as pd
# 重置示例數(shù)據(jù)
data = {
"姓名": ["小明", "小紅", "小剛", "小麗", "小強", "小芳"],
"班級": ["1班", "2班", "1班", "2班", "1班", "2班"],
"數(shù)學(xué)": [85, 92, 85, 90, 88, 92],
"語文": [92, 88, 80, 85, 90, 82]
}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)
# 2.1 先按「班級」升序,再按「數(shù)學(xué)」降序排序
df_sort_multi = df.sort_values(
by=["班級", "數(shù)學(xué)"], # 排序列(先班級,后數(shù)學(xué))
ascending=[True, False] # 對應(yīng)列的排序方向(班級升序,數(shù)學(xué)降序)
)
print("\n按班級升序、數(shù)學(xué)降序排序:")
print(df_sort_multi)
# 2.2 多列排序+重置索引
df_sort_multi_reset = df.sort_values(
by=["班級", "語文"],
ascending=[True, True],
ignore_index=True
)
print("\n按班級升序、語文升序排序(重置索引):")
print(df_sort_multi_reset)核心邏輯:
by傳入列名列表,排序優(yōu)先級從左到右;ascending傳入布爾值列表,與by的列一一對應(yīng)(數(shù)量必須相等)。
3. 按字符串列排序(特殊場景)
支持按字符串的字母 / 漢字順序排序,可結(jié)合字符串方法增強靈活性。
import pandas as pd
data = {
"姓名": ["張三", "李四", "王五", "趙六", "錢七"],
"城市": ["北京", "上海", "廣州", "深圳", "北京"],
"分?jǐn)?shù)": [85, 92, 78, 90, 88]
}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)
# 3.1 按「姓名」字符串排序(漢字拼音順序)
df_sort_name = df.sort_values(by="姓名")
print("\n按姓名字符串排序:")
print(df_sort_name)
# 3.2 按「城市」升序,再按「分?jǐn)?shù)」降序
df_sort_city_score = df.sort_values(by=["城市", "分?jǐn)?shù)"], ascending=[True, False])
print("\n按城市升序、分?jǐn)?shù)降序排序:")
print(df_sort_city_score)
# 3.3 按字符串長度排序(需自定義key)
df["姓名長度"] = df["姓名"].str.len()
df_sort_len = df.sort_values(by="姓名長度")
print("\n按姓名長度排序:")
print(df_sort_len)三、按索引排序(sort_index())
分為「按行索引排序」和「按列索引(列名)排序」,適用于索引有業(yè)務(wù)含義的場景(如日期索引、學(xué)號索引)。
1. 按行索引排序
import pandas as pd
# 構(gòu)建帶自定義行索引的DataFrame
data = {
"數(shù)學(xué)": [85, 92, 78, 90],
"語文": [92, 88, 80, 85]
}
df = pd.DataFrame(data, index=["stu03", "stu01", "stu04", "stu02"])
print("原始DataFrame(行索引混亂):")
print(df)
# 1.1 按行索引升序排序(默認(rèn))
df_sort_idx_asc = df.sort_index()
print("\n按行索引升序排序:")
print(df_sort_idx_asc)
# 1.2 按行索引降序排序
df_sort_idx_desc = df.sort_index(ascending=False)
print("\n按行索引降序排序:")
print(df_sort_idx_desc)2. 按列名排序
通過 axis=1 指定按列索引(列名)排序,適用于列名較多且需規(guī)范順序的場景。
import pandas as pd
# 構(gòu)建列名混亂的DataFrame
data = {
"語文": [92, 88, 80],
"班級": ["1班", "2班", "1班"],
"數(shù)學(xué)": [85, 92, 78],
"姓名": ["小明", "小紅", "小剛"]
}
df = pd.DataFrame(data)
print("原始DataFrame(列名混亂):")
print(df)
# 按列名升序排序(axis=1)
df_sort_cols = df.sort_index(axis=1)
print("\n按列名升序排序:")
print(df_sort_cols)
# 按列名降序排序
df_sort_cols_desc = df.sort_index(axis=1, ascending=False)
print("\n按列名降序排序:")
print(df_sort_cols_desc)關(guān)鍵參數(shù):
axis=0(默認(rèn)):按行索引排序;axis=1:按列索引(列名)排序。
四、進(jìn)階排序技巧
1. 按自定義規(guī)則排序(key參數(shù))
sort_values() 的 key 參數(shù)支持傳入自定義函數(shù),實現(xiàn)非默認(rèn)排序邏輯(如按字符串首字母、數(shù)值的絕對值排序)。
import pandas as pd
import numpy as np
data = {
"姓名": ["Alice", "Bob", "Charlie", "David"],
"分?jǐn)?shù)": [85, -92, 78, -90],
"等級": ["B", "A", "C", "A"]
}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)
# 1.1 按分?jǐn)?shù)的絕對值降序排序
df_sort_abs = df.sort_values(by="分?jǐn)?shù)", key=lambda x: x.abs(), ascending=False)
print("\n按分?jǐn)?shù)絕對值降序排序:")
print(df_sort_abs)
# 1.2 按姓名首字母小寫排序
df_sort_name_lower = df.sort_values(by="姓名", key=lambda x: x.str.lower())
print("\n按姓名首字母小寫排序:")
print(df_sort_name_lower)
# 1.3 按自定義等級規(guī)則排序(A>B>C)
grade_order = {"A": 1, "B": 2, "C": 3}
df_sort_grade = df.sort_values(by="等級", key=lambda x: x.map(grade_order))
print("\n按等級規(guī)則(A>B>C)排序:")
print(df_sort_grade)2. 按行值排序(橫向排序)
默認(rèn)排序是 “縱向”(按列值排行),如需 “橫向”(按行值排列),需結(jié)合 apply 和 sort_values。
import pandas as pd
# 構(gòu)建每行是學(xué)生、每列是科目的DataFrame
data = {
"數(shù)學(xué)": [85, 92, 78],
"語文": [92, 88, 80],
"英語": [88, 90, 85]
}
df = pd.DataFrame(data, index=["小明", "小紅", "小剛"])
print("原始DataFrame(每行是學(xué)生,每列是科目):")
print(df)
# 按每行的值降序排序(橫向排序,即每個學(xué)生的科目按分?jǐn)?shù)從高到低排)
df_sort_row = df.apply(lambda x: x.sort_values(ascending=False).values, axis=1)
# 重置列名(保持原列名順序,僅值排序)
df_sort_row.columns = df.columns
print("\n按每行分?jǐn)?shù)降序排序(橫向):")
print(df_sort_row)3. 排序后保留 / 刪除重復(fù)值
排序后結(jié)合 drop_duplicates() 實現(xiàn) “保留每組最大值 / 最小值” 的場景。
import pandas as pd
data = {
"班級": ["1班", "1班", "2班", "2班", "1班"],
"數(shù)學(xué)": [85, 92, 78, 90, 88],
"姓名": ["小明", "小紅", "小剛", "小麗", "小強"]
}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)
# 按班級分組,保留每個班級數(shù)學(xué)分?jǐn)?shù)最高的學(xué)生
# 步驟1:按班級升序、數(shù)學(xué)降序排序
df_sort = df.sort_values(by=["班級", "數(shù)學(xué)"], ascending=[True, False])
# 步驟2:按班級去重,保留第一個(即分?jǐn)?shù)最高的)
df_top1 = df_sort.drop_duplicates(subset=["班級"], keep="first")
print("\n每個班級數(shù)學(xué)最高分學(xué)生:")
print(df_top1)五、實戰(zhàn)場景:排序的典型應(yīng)用
時間序列數(shù)據(jù)排序
import pandas as pd
import numpy as np
# 構(gòu)建日期索引混亂的溫度數(shù)據(jù)
dates = pd.date_range("2026-01-01", periods=5)
np.random.shuffle(dates) # 打亂日期
data = {
"溫度": np.random.normal(5, 3, 5).round(1),
"濕度": np.random.uniform(30, 80, 5).round(1)
}
df = pd.DataFrame(data, index=dates)
print("原始時間序列數(shù)據(jù)(日期混亂):")
print(df)
# 按日期索引升序排序(恢復(fù)時間順序)
df_sort_date = df.sort_index()
print("\n按日期升序排序:")
print(df_sort_date)
# 按溫度降序排序,保留日期索引
df_sort_temp = df.sort_values(by="溫度", ascending=False)
print("\n按溫度降序排序:")
print(df_sort_temp)六、避坑點與最佳實踐
1. 核心避坑點
- ? 多列排序時 ascending 數(shù)量不匹配:by=["A","B"] 必須對應(yīng) ascending=[True, False](2 個值);
- ? 混淆 axis 參數(shù):按列名排序需設(shè) axis=1,默認(rèn) axis=0 是按行索引;
- ? 忽略缺失值位置:含 NaN 的列排序時,NaN 默認(rèn)放最后,需調(diào)整 na_position 時忘記設(shè)置;
- ? 原地排序后索引混亂:未加 ignore_index=True,導(dǎo)致排序后行索引還是原混亂索引;
- ? 自定義 key 函數(shù)錯誤:key 需返回與原列長度相同的數(shù)組(如 lambda x: x.abs()),而非單個值。
2. 最佳實踐
- ? 優(yōu)先用 sort_values() 按業(yè)務(wù)列排序,sort_index() 按索引排序;
- ? 多列排序時,先排分組列(如班級),后排業(yè)務(wù)列(如分?jǐn)?shù));
- ? 排序后重置索引:重要分析結(jié)果建議加 ignore_index=True,避免索引混亂;
- ? 自定義排序用 key 參數(shù):避免手動修改數(shù)據(jù)后排序,保持代碼簡潔;
- ? 大數(shù)據(jù)集排序:先篩選需要的列(usecols),再排序,提升效率。
總結(jié)
- DataFrame 排序核心依賴兩個函數(shù):
- sort_values(by=列名):按列值排序(單列 / 多列),支持 ascending/na_position/key;
- sort_index(axis=0/1):按行 / 列索引排序,適用于索引有業(yè)務(wù)含義的場景;
- 核心參數(shù):
- by:指定排序列(僅 sort_values 需傳);
- ascending:排序方向(True = 升序,F(xiàn)alse = 降序);
- ignore_index:排序后重置行索引(推薦開啟);
- axis:按行 / 列索引排序(僅 sort_index 需傳);
- 進(jìn)階技巧:
- 自定義規(guī)則用 key 參數(shù)(如絕對值、字符串處理);
- 橫向排序用 apply(axis=1);
- 分組取最值:排序 +drop_duplicates();
- 避坑關(guān)鍵:多列排序時 ascending 數(shù)量匹配,含缺失值時指定 na_position,排序后重置索引。
到此這篇關(guān)于Pandas DataFrame中兩種排序函數(shù)的使用的文章就介紹到這了,更多相關(guān)Pandas DataFrame排序函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- pandas中DataFrame排序及分組排序的實現(xiàn)示例
- pandas dataframe拼接后index重新排序方式
- Pandas DataFrame如何按照一列數(shù)據(jù)的特定順序進(jìn)行排序
- pandas索引與賦值操作、排序以及Series排序和DataFrame排序方式
- pandas?dataframe按照列名給列排序三種方法
- pandas.DataFrame Series排序的使用(sort_values,sort_index)
- Python數(shù)據(jù)分析Pandas?Dataframe排序操作
- Pandas實現(xiàn)DataFrame的簡單運算、統(tǒng)計與排序
- pandas 對series和dataframe進(jìn)行排序的實例
- Pandas 對Dataframe結(jié)構(gòu)排序的實現(xiàn)方法

