深入理解Pandas数据排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解Pandas数据排序相关的知识,希望对你有一定的参考价值。

参考技术A 大家好,我是Peter~

在之前的一篇文章中,详细介绍了关于如何使用pandas的内置函数sort_values来实现数据的排序。本文讲解的是如何使用自定义方式来实现排序:

先模拟一份简单的数据:

参数的具体解释为:

下面通过几个简单的例子来复习下sort_values的使用:

通过nick字段排序,字符串是根据字母的ASCII码;默认是从小到大的升序。第一个字母相同,则比较第二个,类推:

根据数值的大小来升序排列:

可以将排序方式改为降序:

多个字段的同时排序,默认也是升序。当第一个字段的取值相同,再根据第二个字段来升序排列

给不同的字段指定不同的排序方式:

再完整地对比下两种不同的方式:

上面的就是sort_values方法的常见排序方式。

使用sort_values方法排序的时候都是内置的字母或者数值型数据的大小直接来排序,当遇到下面的情况,该如何操作?

当我们根据衣服的大小size来排序,得到的结果是:

明显这样的排序方式不是我们理想中的样子,在我们的认知中:

该如何解决这个问题?提供两种方式:

1、先找到每个size的顺序对应的数值大小

2、生成新的字段order

3、我们对order进行排序

CategoricalDtype是具有类别和顺序的分类数据的类型,能够创建我们自定义的排序数据类型。官网地址:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.CategoricalDtype.html

1、指定一个分类的数据类型CategoricalDtype

2、将size字段设置成上面的CategoricalDtype类型

3、我们直接对size使用sort_values就可以达到我们的目的,和上面的map映射的效果是相同的

而且通过查看df的数据类型,我们也看到size的类型是category:

“深入理解”—插入排序算法


总结下自己对插入排序的理解。


插入排序算法思想:每趟将一个元素,按照其关键字的大小插入到它前面已经排序的子序列中,依此重复,直到插入全部元素。

插入排序包括:直接插入排序、二分插入排序以及希尔排序。




1、直接插入排序:

public void insert(int[] a)
	{
		for(int i=1;i<a.length;i++)     //n-1此扫描,依次向前插入n-1个元素
		{
			int temp=a[i];       //每趟将a[i]插入到前面的排序子序列中
			int j;
			for(j=i-1;j>=0&&temp<a[j];j--)
			{
				a[j+1]=a[j];  //将前面较大的元素向后移动 
			}
			a[j+1]=temp;      //temp值到达插入位置
			
		}
	}
此处内层循环是是a[j+1]=a[j]而不是a[i]=a[j]的原因:在内层循环的第一次是俩者相等,之后j+1将不等于i。所以只能是前者。

2、希尔排序:

希尔排序又称为缩小增量排序,基本思想是分组的直接插入排序。

由直接插入排序算法分析可知,若数据序列接近有序,则时间效率越高;当n较小时,时间效率也很高。希尔排序基于这两点对直接插入排序进行了改进。

算法描述:

(1)将一个数据序列分成若干组,每组由若干相隔一段距离(称为增量)的元素组成,在一个组内采用直接插入排序算法进行排序。

(2)增量初值通常为数据序列长度的一半,以后每趟增量减半,最后值为1。随着增量逐渐减小,组数也减小,组内元素个数增加,数据序列接近有序。


示例如下:

public class ShellSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
       int[] arr={38,55,65,97,27,76};
       Shell s=new Shell();
       s.shellsort(arr);
      // s.shellsort2(arr);
//       for(int a:arr)
//    	   System.out.println(a);
	}

}

class Shell{
	public void shellsort2(int[] a)
	{
		for(int d=a.length/2;d>0;d=d/2)
		 {
			System.out.println("d="+d);
			 for(int i=d;i<a.length;i++)
			 {
				 for(int j=i-d;j>=0;j=j-d)
				 {
					 if(a[i]<a[j])
					 {
						 int temp=a[i];
						 a[i]=a[j];
						 a[j]=temp;
						 
					 }
					 
				 }
			 }
			 
			 for(int z:a)
		    	   System.out.println(z);
		 }	 

	}
	
	public void shellsort(int[] a)
	{
		 for(int d=a.length/2;d>0;d=d/2)
		 {
			 System.out.println("d="+d);
			 for(int i=d;i<a.length;i++)
			 {
				 int temp=a[i];
				 int j;
				 for(j=i-d;j>=0&&temp<a[j];j=j-d)
				 {
					a[j+d]=a[j]; 
				 }
				 a[j+d]=temp;
			 }
			 for(int z:a)
		    	   System.out.println(z);
		 }
	}
	
}

******************************************************************************************************

注意:上边的代码中,方法shellsort2(int [  ]   a )是错误的希尔排序方法!!!

***************************************************************************************************************************


方法shellsort2(int [  ]   a ) 是我一直理解的错误的插入排序方法。此方法,并没有实现元素的挨个比较。比如当i=4时,它只比较了a[4]和a[3]的大小,做不到比较前面的大小,所以是一种错误的插入排序方法。


由上可知,希尔排序共有三重循环:

(1)最外层循环for语句以增量d变化控制进行若干趟扫描,d的初值为序列长度的一半,以后每趟减半,直至为1;

(2)中间for循环进行一趟扫描,序列分为d组,每组由相距为d远的n/d个元素组成,每组元素分别进行直接插入排序;

(3)最内层循环for语句进行一组直接插入排序,将一个a[i]插入到其所在组前面的排序子序列中。


希尔排序与直接插入排序的区别其实就是希尔排序多了一层循环用来控制扫描躺数,并且在每次的直接插入排序中,间隔为d而不是间隔为1,所以将i=1,j=i-1等改为了i=d,j=i-d等。


若不能理解,则举例子说明哦,自己将每趟的数据记录在纸上,就会恍然大悟的哦^_^




以上是关于深入理解Pandas数据排序的主要内容,如果未能解决你的问题,请参考以下文章

Pandas之:深入理解Pandas的数据结构

pandas深入理解

Pandas之:深入理解Pandas的数据结构

重温数据结构:深入理解红黑树

冒泡排序深入理解

“深入理解”—插入排序算法