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数据排序实现

原文地址:https://www.cnblogs.com/hider/p/15758725.html