Pandas:sort_indexsort_values方法的使用

Posted Sun_Sherry

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pandas:sort_indexsort_values方法的使用相关的知识,希望对你有一定的参考价值。

sort_index和sort_values既是Series类型数据自带的方法,也是DataFrame数据自带的方法。本篇博客以DataFrame为例进行讲述。

1 概览

sort_index和sort_values可以将DataFrame中的数据按照索引及值的大小进行排序。这两个方法所包含的参数及其作用都基本一致。如下表所示:

参数作用
bysort_values方法独有的参数;指定排序列名或索引;
levelsort_index方法独有的参数;指定排序索引所在的层级;
axis指定排序的轴;
ascending升序(True)或者降序(False);
inplace是否本地置换,参考博客:Pandas和Numpy:常见函数参数inplace的作用_Sun_Sherry的博客-CSDN博客_inplace函数
kind指定排序算法:'quicksort', 'mergesort', 'heapsort', 'stable';
na_position指定空值数据放置的位置:'first'、'last';
ignore_index是否重新生成索引;新索引为0,1,……,
key自定义排序方法;
sort_remainingsort_index方法独有的参数;目前作用还不太明白

为了方便说明,先创建如下DataFrame变量:

import pandas as pd
data=pd.DataFrame([[1,33],[None,3],[45,97],[100,23]],
                  columns=['col_1','col_2'],
                  index=['A1','A2','B1','C2'])

其结果如下:

1.1 sort_index用法

顾名思义,sort_index可以将DataFrame按照索引的大小顺序重新排列。其用法如下:

data_1=data.sort_index(ascending=False,ignore_index=True)

其结果如下:

先将data按其索引的逆序排序重新进行排列,逆序排列后的索引顺序为:C2->B1->A2->A1,并抛弃原有的索引(因为设置了ignore_index参数)即可得到上述结果。

1.2 sort_values用法

同样,sort_values可以将DataFrame按指定值的大小顺序重新排列,其用法如下:

data_2=data.sort_values(by='col_2',ascending=False,na_position='first',axis=0)
#按对应值与7运算余数大小来排列
data_3=data.sort_values(by='col_2',,ascending=False,key=lambda x:x%7)  

其结果如下:

这里有以下几点需要说明:

  • data_2中的na_position指定的是排序列(本例中为col_2)中的空值对应的数据的存放位置,对其他列中的空值不施加任何影响;
  • data_3的排序结果说明:col_2列中的每个值进行key中指定的操作得到:key(97)=6, key(33)=5, key(3)=3, key(23)=2。然后按照这个大小顺序进行排列。
  • 要注意自定义排序方法key中匿名函数的写法。该匿名函数中x对应的是DataFrame中指定排序列中的每一个具体元素,比如97,33等;

2 其他参数用法

第1部分介绍了sort_index和sort_values的主要参数及其常规用法。这一部分主要介绍其他参数的用法。

2.1 level:使用某一层级的索引来排序

当DataFrame中的索引为复合索引(MultiIndex)时,需要按照某个指定层级的索引对DataFrame进行排序时,可以通过设置level来实现。先使用如下代码修改data的索引:

data.index=pd.MultiIndex.from_product([['A1','A2'],['B1','B2']],names=['idx_1','idx_2'])

修改后的data结果如下:

当需要使用idx_2对应的索引对DataFrame进行排序时,可以使用参数level。具体如下:

data_4=data.sort_index(level=1) #也可以写作level='idx_2'

data_4结果如下:

2.2 axis轴

为了方便后续说明,先构建如下数据:

import pandas as pd
import numpy as np
data=pd.DataFrame(np.random.randint(10,100,size=(6,6)),
                  columns=pd.MultiIndex.from_product([['col_1','col_2'],['C1','C2','C3']],
                                                    names=['L_CF','L_CS']),
                  index=pd.MultiIndex.from_product([['idx_1','idx_2'],['R1','R2','R3']],
                                                  names=['L_IF','L_IS']))

data结果如下:

2.2.1 set_index中的axis

当set_index中的参数axis=1时,可以将DataFrame中的列按照其列名的大小顺序重新进行排列。具体如下:

data_5=data.sort_index(axis=1,ascending=False,level=1)

其结果如下(图中红框中的即为进行排序操作的值,level=1):

2.2.2 set_values中的axis

set_values方法中的axis情况需要分别讨论。具体如下:

  • axis=0中可以将DataFrame按索引的大小顺序重新对数据进行排列。
data_6=data.sort_values(axis=0,by='L_IS',ascending=False)

其结果如下:

  •  当axis=1时可以将DataFrame按指定某一行的元素大小进行重排。
    data_7=data.sort_values(axis=1,by=[('idx_2','R3')])

其结果如下(此时by中要写入排序行的索引):

2.2.3 总结

关于set_index和sort_values中的axis轴参数引发的一些思考,总结如下:

  • 关于index:以前关于DataFrame中的index只是片面地认为就是行索引,但是DataFrame的列名也可以被称为索引。比如data的定义中其二级列明的定义使用的仍然时pd.MultiIndex方法。同样,对于value也是类似。 

OSError: [WinError 123] 当我创建 kfp 组件时

【中文标题】OSError: [WinError 123] 当我创建 kfp 组件时【英文标题】:OSError: [WinError 123] when I create kfp component 【发布时间】:2021-12-18 21:43:04 【问题描述】:

我正在尝试使用我自己在 Spyder 中本地笔记本中的组件在带有 kfp 的 Vertex AI 中创建管道。

当我运行以下代码时:

@component(base_image="python:3.9", packages_to_install=["pandas"])
def create_dataset(
    gcs_csv_path_train: str,
    dataset: Output[Dataset],
):
    import pandas as pd
    df = pd.read_csv(gcs_csv_path_train)
    dataset = df.pop('Class')

我收到以下错误:

OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect: '<ipython-input-11-b28c15ec667f>'

如果我在线使用 Jupyter 笔记本,则不会引发错误。

我做错了什么?谢谢。

【问题讨论】:

gcs_csv_path_train的值是多少?它是否遵循 Windows 文件命名方案? @JohnHanley gsc_csv_path_train 是谷歌云存储桶中文件的路径,就像这样:gsc_csv_path_train = f"bucket/folder/file.csv"。在 Traceback 中,错误指向以下行: def create_dataset( Google Cloud 存储的路径如下所示:gs://bucket/folder/file.csv 错误消息表示文件名被截获为Windows 文件系统。 【参考方案1】:

您需要检查您在代码中使用的文件路径。因为 Windows 文件名中有一些不被接受的字符,例如冒号“:”。你可以看到更多关于 Windows 标准路径的documentation。

在python代码中使用路径时,请遵循以下:

在任何路径前使用“r” - r 是一个字符串文字,可以让 任何字符串作为原始字符串,这意味着所有转义码都将是 忽略。 使用双引号“文件路径”或单引号“文件路径” 指定路径。 不要同时使用“”或“”

正确的文件路径如下

filepath = r'C:\Test\file\file-input-thecodebuzz.txt'

filepath = r"C:\Test\file\file-input-thecodebuzz.txt"

你可以看到更多documentation。

【讨论】:

以上是关于Pandas:sort_indexsort_values方法的使用的主要内容,如果未能解决你的问题,请参考以下文章