Python大数据分析5:数据的排序

常见的数据排序操作主要是指对行的排序,它是一种非常常见的操作,比如按照学生身高、成绩对记录进行排序输出等等。大家应该还能记得DataFrame通常是以追加方式来插入新的行记录,因此后续适应用户需求的行排序将变得更为重要。

排序有两种基本的方法:

第一种就是使用索引号,这个每个行自带的索引号本身就是可以排序。比如这个是我们以前的学生例子。一般而言,不指定索引号,系统会默认按照从0开始的整数依次对所有行设定索引号,并据此实现行排序。

可以通过reindex重新索引的函数方法来再次设定新的排序依据,我们可以看到操作后,数据记录已经按照新的次序排好。

frame = frame.reindex([6, 5, 4, 3, 2, 1, 0])

请注意,如果希望排序能真正存储下来,可以重新保存到原有DataFrame类变量。

第二种排序意义更大,往往是根据一些特定字段的值来进行,比如我们准备按照学生身高来对所有学生记录进行排序:

print(frame.sort_values(by=[‘height’]))

这个可以通过sort_values函数来实现,它需要设定一个或者多个列名称来表明排序依据,默认按照升序来排列。

这里需要说明下,对于数值,排序就会按照数值大小进行判断,对于字符,一般按照对应的字符编码进行,这种编码顺序一般和过去的ASCII编码基本一致。但是对于汉字信息,问题比较复杂。因为汉字有不同的编码方式,这依赖于当前电脑操作系统和数据表示等多种因素,但是不管哪一种,最终系统还是会按照当前汉字编码的顺序方式来排序

比如这是按照姓名的排序结果。其中encode函数返回汉字对应的当前系统的汉字编码。

如果想换成降序,可以增加参数ascending为假来实现:

print(frame.sort_values(by=[‘height’], ascending=False))

ascending表示上升,为假当然表示不上升即下降。

如果有多个列,则首先按照第一列来排,然后相同数值的再按照第二列再排。比如先按照年龄升序再按照身高降序:

frame = frame.sort_values(by=[‘age’, ‘height’], ascending=[True, False])

不管上述哪一种排序,可能都会对现有的行索引号带来影响,从而导致顺序失效。因此可以通过reset_index函数实现重新排序索引:

frame = frame.reset_index(drop=True)

这里drop参数为真表示删除原有的旧索引号,否则为了保持和原有数据的对应关系,原有旧索引也不会默认删除。

这个方法很有用,即使是在对数据进行删除和插入等操作后,也可以通过该方法实现对索引号的重新排序生成。

在任何时候,如果对你现有的记录做了很多排序调整,索引号也不再是过去的有序序列,都可以重新恢复下按照索引号的排序结果,方法是利用sort_index:

frame = frame.sort_values(by=[‘height’])

print(frame)

print(frame.sort_index())

此时,大家能看到,记录再次按照索引号重新排好了。

除了能对行排序外,其实列也可以排序调整次序。最为简单的方法就是利用以前介绍过的数据选择方法,重新选择数据列的次序,如:

print(frame[[‘name’, ‘height’, ‘ID’, ‘age’, ‘gender’]])

其次,刚才所说的行排序方法也适用于列的排序。一般而言,列的排序主要用在纯数字的表格数据中。比如我们这里先创建一个数字矩阵:

data = {‘col1’: [4, 2, 1, 3, 5],

        ‘col2’: [6, 4, 2, 6, 1],

        ‘col3’: [4, 2, 7, 6, 0],

        ‘col4’: [4, 3, 1, 5, 2]}

frame = pd.DataFrame(data)

现在我们准备对列来排序,其实就是指以某一行或者某几行的数值来排序。比如我们以第四行数值来对几个列排序:

print(frame.sort_values(by=[3], axis=1))

其中by参数后面的这个3是指索引号,而这个axis是指排序对象换成了列,默认为0表示对行排序。

注意,这时是以整个列为单位来排序,因此各个列次序按照第四行的大小进行了调整,我们可以从目前的列名称看的很清楚。

发表评论

邮箱地址不会被公开。 必填项已用*标注