首页 > 其他分享 >dataframe 多字段排序

dataframe 多字段排序

时间:2022-12-05 18:34:17浏览次数:42  
标签:sort gene df mid dataframe values str 排序 多字段

需求:

import pandas as pd

    df = pd.DataFrame(
        {'gene': ['BC061237', 'Gm19965', 'Afdvwef', 'Vafsx', '4930599A14Rik', 'am45766'],
         'mid': [2, 2, 5, 7, 2, 2],
         'count': [3, 6, 2, 7, 3, 3]})

image

对于上边这个dataframe,先按字段mid顺序排序,如果mid值相同,再用gene字段按ascii值不区分字母大小写顺序排序


解决方案

方案一(会区分大小写,不适用):

df.sort_values(by=['mid', 'gene'])

image

方案二 (大量数据时,并不会根据gene字段排序)

df.sort_values('gene', key=lambda x: x.str.lower()).sort_values('mid')

image

用真实数据做如下测试,发现不满足需求

image

方案三 (满足需求)

对于方案一,唯一的问题是会区分字母小大写,所以多方案一进行优化,做如下改动

df.sort_values(by=['mid', 'gene'], key=lambda x: x.str.lower())

image

直接这样执行会出错,分析原因:

  • 是因为gene是字符串类型,调用.str.lower()是没问题,但是mid是数值类型,调用.str.lower()会有问题
    image

解决异常:

  • 我们只对字符串类型的做大小写准换,对数值类型不处理。
def str2lower(sr):
    try:
        return sr.str.lower()
    except:
        return sr

修改上边的代码

df.sort_values(by=['mid', 'gene'], key=str2lower)

image

在真实数据测试

r = gene_table.sort_values(by=['MIDcount', 'gene'], key=str2lower)
r[:5]

image
先按MIDcount的值顺序排序,再根据gene的值不区分字母大小写顺序数据,满足需求。(在这里看到的gene值全都是数字开头是因为数据太大,只输出了前5个元素)

标签:sort,gene,df,mid,dataframe,values,str,排序,多字段
From: https://www.cnblogs.com/yimeimanong/p/16953038.html

相关文章

  • 选择排序
    选择排序选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小......
  • 4、excel快速排序从1开始
    在分世界杯的文件时,要求把每一行从1开始排列,自己的做法就是先输入1和2,然后拖黑1和2,接着鼠标一直往下拖,这样就了。公式的方法:输入公式=Row()-1,如何在这个单元格的右下角双......
  • 排序实现
    十大经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需......
  • 拓扑排序 专题
    拓扑排序(\(Topological\)\(sorting\))拓扑排序指的是有向无环图(\(DAG\));学过计算机网络的知道计算机网络中有一个拓扑结构;下面就是一个拓扑结构;那拓扑序就是,图中任意一对顶点......
  • js多个(N)个数组的的元素组合排序算法,多维数组的排列组合或多个数组之间的排列组合
    现在有一批手机,其中颜色有['白色','黑色','金色','粉红色'];内存大小有['16G','32G','64G','128G'],版本有['移动','联通','电信'],要求写一个算法,实现[['白色','16G','移动'......
  • 数组排序,自己内部会调整,数组也是引用类型
    Java的基本数据类型有8种,分别是:byte(位)、short(短整数)、int(整数)、long(长整数)、float(单精度)、double(双精度)、char(字符)和boolean(布尔值)。数组是引用类型 int[] arr2 = {......
  • golang的快速排序
    1、什么是快速排序:快速排序是一种分治策略的排序算法,本质上来看,快速排序是对冒泡排序的一种改进,属于交换类的排序算法。是由英国计算机科学家 TonyHoare​ 发明的,该算法......
  • 排序简介
    排序的概念及其运用排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键......
  • 排序算法:快速排序
    简介快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n个项目要Ο(nlogn)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排......
  • 排序算法:比较排序
    算法简介:排序排序是一个非常经典的问题,它以特定顺序(递增、非递减(递增或扁平))对数组(或列表)的项目(可以比较,例如整数、浮点数、字符串等)进行重新排序)、递减、非递增(递减或平......