一、背景
利用 pd.sort_values
可以實現對數據框的排序。
DataFrame.sort_values(by, # 排序字段
axis=0, #行列
ascending=True, # 升序、降序
inplace=False, # 是否修改原始數據框
kind='quicksort', # 排序方式
na_position='last', # 缺失值處理方式
ignore_index=False, # 忽略索引
key=None) # 函數
二、特殊需求
使用 sort_values
方法排序時都是根據內置的字母或者數值大小直接排序。
如果需要針對自定義的排序方式進行排序。
例如:衣服的碼數(S/M/L)、按地市(廣州、深圳...)等。
可通過以下兩種方式實現:
map
映射關系CategoricalDtype
類型實現
1.測試數據
import pandas as pd
import numpy as np
df = pd.DataFrame({
"Name":["aaa","bbb","aba","abc","cac","ccc"],
"Length":[100,120,130,111,100,128],
"High":[140,80,120,90,125,116],
"Size":["S","M","L","XS","XL","L"]
})
df
2.傳統排序
df.sort_values('Name')
df.sort_values('Length')
df.sort_values('High', ascending=False) # 降序
df.sort_values(['Length', 'High'])
df.sort_values(['Length', 'High'], ascending=[True, False]) # 多字段排序
3.自定義排序
- 映射方式
# 輸出並非預期
df.sort_values('Size')
'''
Name Length High Size
2 aba 130 120 L
5 ccc 128 116 L
1 bbb 120 80 M
0 aaa 100 140 S
4 cac 100 125 XL
3 abc 111 90 XS
'''
# 構造map字典
order = ['XS','S','M','L','XL']
order_map = dict(zip(order, range(len(order))))
# {'L': 3, 'M': 2, 'S': 1, 'XL': 4, 'XS': 0}
df['Order'] = df['Size'].map(order_map)
df
'''
Name Length High Size Order
0 aaa 100 140 S 1
1 bbb 120 80 M 2
2 aba 130 120 L 3
3 abc 111 90 XS 0
4 cac 100 125 XL 4
5 ccc 128 116 L 3
'''
# 輸出滿足要求
df.sort_values('Order')
'''
Name Length High Size Order
3 abc 111 90 XS 0
0 aaa 100 140 S 1
1 bbb 120 80 M 2
2 aba 130 120 L 3
5 ccc 128 116 L 3
4 cac 100 125 XL 4
'''
- 使用
CategoricalDtype
類型
CategoricalDtype
具有類別和順序的分類數據的類型,能夠創建自定義的排序數據類型。
# 指定一個分類的數據類型
category_size = pd.CategoricalDtype(
['XS','S','M','L','XL'],
ordered=True
)
category_size
# CategoricalDtype(categories=['XS', 'S', 'M', 'L', 'XL'], ordered=True)
# 分類取值
category_size.categories
# Index(['XS', 'S', 'M', 'L', 'XL'], dtype='object')
# 字段設置為 CategoricalDtype 類型
df['Size'] = df['Size'].astype(category_size)
df.dtypes
'''
Name object
Length int64
High int64
Size category
dtype: object
'''
# 排序
df.sort_values('Size')
'''
Name Length High Size
3 abc 111 90 XS
0 aaa 100 140 S
1 bbb 120 80 M
2 aba 130 120 L
5 ccc 128 116 L
4 cac 100 125 XL
'''
參考鏈接:精華!Pandas數據排序實現