zoukankan      html  css  js  c++  java
  • 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数据排序实现

  • 相关阅读:
    计算机考研复试真题 数字求和
    计算机考研复试真题 简单计算器
    计算机考研复试真题 N阶楼梯上楼问题
    P1082 [NOIP2012 提高组] 同余方程
    进制转换
    浮点数加法
    N的阶乘
    1055 The World's Richest (25 分)
    1028 List Sorting (25 分)
    1062 Talent and Virtue (25 分)
  • 原文地址:https://www.cnblogs.com/hider/p/15758725.html
Copyright © 2011-2022 走看看