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

  • 相关阅读:
    FreeCommander 学习手册
    String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)
    StringBuffer 详解 (String系列之3)
    StringBuilder 详解 (String系列之2)
    java io系列26之 RandomAccessFile
    java io系列25之 PrintWriter (字符打印输出流)
    java io系列24之 BufferedWriter(字符缓冲输出流)
    java io系列23之 BufferedReader(字符缓冲输入流)
    java io系列22之 FileReader和FileWriter
    java io系列21之 InputStreamReader和OutputStreamWriter
  • 原文地址:https://www.cnblogs.com/hider/p/15758725.html
Copyright © 2011-2022 走看看