排序Pandas数据框
Pandas数据框可以按索引和值排序
![图片发布](https://miro.medium.com/max/1562/1*I1cvuu0Ogzn2fee1B7KmaA.png)
我们可以按行值/列值对Pandas数据框进行排序。同样,我们也可以按行索引/列索引进行排序。
![图片发布](https://miro.medium.com/max/1680/1*_bTwjr-SZqyUuBsHCC4MKg.png)
Pandas DataFrame按值排序
DataFrame。sort_values(by,axis = 0,ascending = True,inplace = False,kind =' quicksort ',na_position ='last',ignore_index = False,key = None)
![图片发布](https://miro.medium.com/max/1544/1*HyiFdz_r-BL6es1z_K4TnA.png)
返回类型为 DataFrame或无。
如果排序的inplace
返回类型为None
,则为DataFrame。
1.按一列对数据框进行排序
通过从CSV文件读取来创建DataFrame。
import pandas as pd df=pd.read_csv("C:pandas_experimentpandas_sortingdata1.csv") df
![图片发布](https://miro.medium.com/max/544/1*6RxOvUwbUshRFYIC-UqmMg.png)
现在,按一列(EmpId
)中的值对数据框进行排序。
df.sort_values('EmpID')
![图片发布](https://miro.medium.com/max/580/1*iLfPvig94qN7Q_Hd9D51Zw.png)
默认情况下,它将以升序排序。该索引也将保持不变。
返回类型是一个数据框。它不会修改原始数据框。
2.按一列按降序对数据框进行排序
按列EmpID降序对数据框进行排序。不得不提ascending=False
。
返回类型是一个数据框。它不会修改原始数据框。
df.sort_values(‘EmpID’,ascending=False)
![图片发布](https://miro.medium.com/max/640/1*RWG0H7IpLatp1PO_uOxO7w.png)
3.按两列对数据框进行排序
按列Skill
和排序数据框EmpID
。如果列Skill
中的值相同,则它将基于第二列中的值进行排序EmpID
df.sort_values(by=['Skill','EmpID'])
![图片发布](https://miro.medium.com/max/678/1*gIRU9LWbb1UZyTdmMe8bKg.png)
首先,它将基于“Skill”
列中的值进行排序。由于JavaScript
列中的值Skill
相同,因此它将再次按值EmpID
升序排序。
返回类型是一个数据框。它不会修改原始数据框。
4.按两列以不同顺序对数据框进行排序
按列Skill
和排序数据框EmpID
。一列以升序排列,另一列以降序排列。
df.sort_values(by=['Skill','EmpID'],ascending=[True,False])
![图片发布](https://miro.medium.com/max/622/1*aY-FyUkj8CPYSQMcFzkC-g.png)
首先,数据帧将基于“Skill”
列中的值以升序排序。由于JavaScript
列中的值Skill
相同,因此它将按值EmpID
降序排序。
返回类型是一个数据框。它不会修改原始数据框。
5.通过将NaN放在首位对数据帧进行排序
首先将缺失值放在数据NaN
框中进行排序。na_position=”first”
df.sort_values("Salary",na_position='first')
![图片发布](https://miro.medium.com/max/580/1*BFkSyUiwI7vqDURh4CQzxA.png)
返回类型是一个数据框。它不会修改原始数据框。
6.就地排序数据框
如果参数inplace设置为True(inplace=True
),它将执行就地操作。修改原始数据框本身。返回类型为无。
df.sort_values("Salary",inplace=True) df
![图片发布](https://miro.medium.com/max/634/1*htag_iPSesWSjs-WZAOzew.png)
7.通过忽略索引对数据帧进行排序。
对数据框进行排序将保持相同的索引。如果要忽略索引,然后不得不提及ignore_index=True
,则结果轴将标记为0、1,…,n-1。
df.sort_values("Salary",ignore_index=True)
![图片发布](https://miro.medium.com/max/540/1*PP4ig_pgyTdEgY2Laxw4vQ.png)
8.使用键功能对数据框进行排序
在排序之前,将键函数应用于这些值。这类似于内置sorted()
函数中的key参数,但值得注意的区别是此key函数应被向量化。它应该期望aSeries
并返回与输入形状相同的Series。它将by
独立应用于每个列。- Python文档
df.sort_values(by=["Skill"],key=lambda x:x.str.lower())
![图片发布](https://miro.medium.com/max/546/1*gvDuZgFI13SsYhmnVGH1XQ.png)
键功能(str.lower()
)应用于“Skill”
列中的所有值,然后进行排序。如果包含相同的值,则基于行索引进行排序。
如果未在“Skill”
列上调用键函数,则大写字母将首先排序。
df.sort_values(by=["Skill"])
![图片发布](https://miro.medium.com/max/620/1*xNVqpcNAQHu0C1n9jtcTzQ.png)
9.按字符串长度对数据框进行排序
按字符串长度对数据框进行排序。给出了键函数,它将计算给定列()中值的长度。根据列中值的长度,它将对数据框进行排序。key=lambda x:x.str.len()
“SKill”
“Skill”
df.sort_values(by=["Skill"],key=lambda x:x.str.len())
![图片发布](https://miro.medium.com/max/708/1*KIJkItXB9TMfGcKDWx2FTA.png)
10.按行值对数据框进行排序
我们还可以按特定的行值对数据框进行排序。
创建一个包含数字的数据框。
df = pd.DataFrame(data={'x':[10,30,20], 'y':[1,2,3],'z':[5,15,10]}) df
![图片发布](https://miro.medium.com/max/406/1*kNx6u2kqlS7eyR82T_VvMQ.png)
我们可以根据特定行中的值对数据框进行排序。让我们进行排序row 0
默认情况下,它将按升序对行中的值进行排序。
![图片发布](https://miro.medium.com/max/412/1*nh1-KJUTRz1wJ6vqZglQew.png)
df.sort_values(by=0,axis=1)
by=0
表示第0行。
axis=1
指示要排序的列。
![图片发布](https://miro.medium.com/max/446/1*bKS47nt4ZNSN22W9Pje-NQ.png)
如果要排序的行包含不同的数据类型,它将提高TypeError
。
df1 = pd.DataFrame(data={'x':[10,10,"d"], 'y':['a',5,'c'],'z':[5,15,'a']}) df1
![图片发布](https://miro.medium.com/max/382/1*iKZEpmUhbL7V2arBNQG9Zw.png)
如果我们按row0对数据帧进行排序,它将提高TypeError
。row 0
包含字符串和整数。
![图片发布](https://miro.medium.com/max/356/1*yoFQcViRaHG6FjNhKJarIA.png)
df1.sort_values(by=0,axis=1)
Output:
TypeError: ‘<’ not supported between instances of ‘str’ and ‘int’
但是我们可以基于row1和row2对数据帧df1进行排序。int
第1行str
仅包含,第2行仅包含。
![图片发布](https://miro.medium.com/max/336/1*8P7KEVWoTVnb5ETcSC6fKw.png)
df1.sort_values(by=2,axis=1)
![图片发布](https://miro.medium.com/max/468/1*j5zqLs3ZIngt0pSHR3xRIQ.png)
Pandas.DataFrame.sort_index
DataFrame.sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, ignore_index=False, key=None)
按标签(沿轴)对对象排序。
如果inplace
参数为False
,则返回按标签排序的新DataFrame ,否则更新原始DataFrame并返回None
。
1.按行索引对数据框进行排序
创建一个数据框。
df=pd.read_csv("C:pandas_experimentpandas_sortingdata2.csv") df
![图片发布](https://miro.medium.com/max/690/1*3n_MAIW-nfXq0QGU7AaAeA.png)
将EmpID
列设置为行索引。
df.set_index('EmpID',inplace=True)
![图片发布](https://miro.medium.com/max/586/1*QP1ua7PvA4KbGrevwM7PxQ.png)
我们可以按行索引和列索引对数据进行排序。
![图片发布](https://miro.medium.com/max/152/1*nHKA6dNcFV0H78sX0lmRMA.png)
df.sort_index() or df.sort_index(axis=0)
两者是相同的。axis=0
表示按行索引排序。
![图片发布](https://miro.medium.com/max/672/1*DDCQZAk47oWv6XNrR362XQ.png)
默认情况下,它将以升序排序。
2.按列索引对数据框进行排序
通过提及按列索引对数据框进行排序axis=1
。
![图片发布](https://miro.medium.com/max/346/1*KIVlfRAcrvLkGt8FXWiFBw.png)
df.sort_index(axis=1)
![图片发布](https://miro.medium.com/max/620/1*vnomjHUbHp5GrURsA74guA.png)
默认情况下,它将按升序排序。
3.排序具有多索引的数据框
创建一个数据框并将两列设置为row_index。
df=pd.read_csv("C:pandas_experimentpandas_sortingdata2.csv") df.set_index(["EmpID","Age"],inplace=True)
![图片发布](https://miro.medium.com/max/536/1*BtsTclgb6O_jzyDKaRJYDg.png)
现在,我们可以按row_index EmpID和Age对数据框进行排序。
如果level=0
给出,它将基于row_index排序“EmpID”
df.sort_index(level=0)
如果level=1
表示将根据row_index对数据框进行排序“Age”
默认情况下,sort_remaining=True
表示如果按级别和索引排序是多级的,则在按指定级别排序后也按其他级别(按顺序)排序。
在此示例中,它将按级别1(“Age”
)进行排序,如果值的均值相同,则它将按另一个索引(“EmpID”
)进行排序
df.sort_index(level=1)
![图片发布](https://miro.medium.com/max/580/1*IF_9Ela5B0taZkZ741G51w.png)
4.仅将具有多索引的数据框按一级排序
通过提及一级和sort_remaining=False
,我们只能将具有多索引的数据框排序为一级。
df.sort_index(level="Age",sort_remaining=False)
![图片发布](https://miro.medium.com/max/578/1*U89VicD6-4Op_mesgBJpTw.png)
在此示例中,EmpID
索引未排序。数据框仅基于“Age”
索引排序。
5.按索引降序对数据框排序
如果我们提到ascending=False
,它将根据提到的索引以降序对数据帧进行排序。
df.sort_index(axis=0,ascending=False)
![图片发布](https://miro.medium.com/max/612/1*INJ3P7qlNQLuTSYy5xe-Jw.png)
结论:
- 如果对pandas数据框进行排序,则返回带有排序值的数据
inplace=False
框。否则,如果inplace=True
返回None
,它将修改原始数据框本身。 - 默认情况下,所有排序仅按升序进行。如果我们提到的话,
ascending=False
它将以降序排列。