Python學習筆記:按特定字符排序sort_values


一、背景

利用 pd.sort_values 可以實現對數據框的排序。

DataFrame.sort_values(by, # 排序字段
               axis=0,  #行列
               ascending=True, # 升序、降序 
               inplace=False,  # 是否修改原始數據框
               kind='quicksort',  # 排序方式
               na_position='last', # 缺失值處理方式
               ignore_index=False,  # 忽略索引
               key=None) # 函數

可以參考:Python學習筆記:pd.sort_values實現排序

二、特殊需求

使用 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數據排序實現


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM