pandas中按行或列的值對(duì)數(shù)據(jù)排序的實(shí)現(xiàn)
在處理表格型數(shù)據(jù)時(shí),常會(huì)用到排序,比如,按某一行或列的值對(duì)表格排序,要怎么做呢?
這就要用到 pandas 中的 sort_values() 函數(shù)。
一、 按列的值對(duì)數(shù)據(jù)排序
先來(lái)看最常見(jiàn)的情況。
1.按某一列的值對(duì)數(shù)據(jù)排序
以下面的數(shù)據(jù)為例。
import pandas as pd
df_col = pd.DataFrame({'Name':['Paul','Richard', 'Betty', 'Philip','Anna'], 'course1':[85,83,90,84,85], 'course2':[90,82,79,71,86], 'sport':['basketball', 'Volleyball', 'football', 'Basketball','baseball']}, index=[1,2,3,4,5]) df_col
Name | course1 | course2 | sport | |
---|---|---|---|---|
1 | Paul | 85 | 90 | basketball |
2 | Richard | 83 | 82 | Volleyball |
3 | Betty | 90 | 79 | football |
4 | Philip | 84 | 71 | Basketball |
5 | Anna | 85 | 86 | baseball |
在 sort_values() 函數(shù)中設(shè)置 by='列名',即可以按這一列值的順序重新排列行。
df_sort=df_col.sort_values(by='course2') df_sort
Name | course1 | course2 | sport | |
---|---|---|---|---|
4 | Philip | 84 | 71 | Basketball |
3 | Betty | 90 | 79 | football |
2 | Richard | 83 | 82 | Volleyball |
5 | Anna | 85 | 86 | baseball |
1 | Paul | 85 | 90 | basketball |
如以上結(jié)果所示,默認(rèn)是升序排列。還可以做降序排列,在 sort_values() 函數(shù)中設(shè)置 ascending=False 即可。例如:
df_sort=df_col.sort_values(by='course2',ascending=False) df_sort
Name | course1 | course2 | sport | |
---|---|---|---|---|
1 | Paul | 85 | 90 | basketball |
5 | Anna | 85 | 86 | baseball |
2 | Richard | 83 | 82 | Volleyball |
3 | Betty | 90 | 79 | football |
4 | Philip | 84 | 71 | Basketball |
2. 按多列的值對(duì)數(shù)據(jù)排序
您是否遇到過(guò)這種情況:要排序的某一列數(shù)據(jù)有相同的值,此時(shí)結(jié)果會(huì)怎么樣呢?我們來(lái)看下面的例子。
df_sort=df_col.sort_values(by='course1') df_sort
Name | course1 | course2 | sport | |
---|---|---|---|---|
2 | Richard | 83 | 82 | Volleyball |
4 | Philip | 84 | 71 | Basketball |
1 | Paul | 85 | 90 | basketball |
5 | Anna | 85 | 86 | baseball |
3 | Betty | 90 | 79 | football |
從結(jié)果看到,“course1” 有兩個(gè)相同的值 85,此時(shí)會(huì)依據(jù) index 的先后順序排列。
那如果不想按 index 順序,想要自己設(shè)定相同值的排序方式,應(yīng)該怎么做呢?
可以設(shè)置第二列,對(duì)于第一列的相同值,參照第二列的值排序。例如:
df_sort=df_col.sort_values(by=['course1','course2']) df_sort
Name | course1 | course2 | sport | |
---|---|---|---|---|
2 | Richard | 83 | 82 | Volleyball |
4 | Philip | 84 | 71 | Basketball |
5 | Anna | 85 | 86 | baseball |
1 | Paul | 85 | 90 | basketball |
3 | Betty | 90 | 79 | football |
可以看到,by 參數(shù)中的第二列 “course2” 只在第一列 “course1” 中有相同值時(shí)起作用,因此只有 “Anna” 和 “Paul” 所在的這兩行數(shù)據(jù)位置互換,其它行位置不變。
3. key 參數(shù):設(shè)置排序時(shí)的數(shù)據(jù)變換函數(shù)
在實(shí)際中還可能會(huì)遇到這種情況,數(shù)據(jù)中大小寫(xiě)都有,比如例子數(shù)據(jù)的 “sport” 列。按這一列對(duì)數(shù)據(jù)排序,結(jié)果如下:
df_sort=df_col.sort_values(by=['sport']) df_sort
Name | course1 | course2 | sport | |
---|---|---|---|---|
4 | Philip | 84 | 71 | Basketball |
2 | Richard | 83 | 82 | Volleyball |
5 | Anna | 85 | 86 | baseball |
1 | Paul | 85 | 90 | basketball |
3 | Betty | 90 | 79 | football |
看結(jié)果發(fā)現(xiàn),大寫(xiě)字母排在小寫(xiě)字母前面,因此 “Volleyball” 所在行排在 “baseball” 所在行前面,但這并不是我們想要的排序結(jié)果。那應(yīng)該怎么做,才能按字母順序排序呢?
可以設(shè)置 sort_values() 函數(shù)的 key 參數(shù)。
df_sort=df_col.sort_values(by=['sport'],key=lambda col:col.str.lower()) df_sort
Name | course1 | course2 | sport | |
---|---|---|---|---|
5 | Anna | 85 | 86 | baseball |
1 | Paul | 85 | 90 | basketball |
4 | Philip | 84 | 71 | Basketball |
3 | Betty | 90 | 79 | football |
2 | Richard | 83 | 82 | Volleyball |
此時(shí)的排序結(jié)果就是按字母順序排列。
4. 修改原數(shù)據(jù)
前面介紹的操作中,每次都生成了一個(gè)新的數(shù)據(jù) df_sort,并沒(méi)有改變?cè)瓟?shù)據(jù)。
df_col
Name | course1 | course2 | sport | |
---|---|---|---|---|
1 | Paul | 85 | 90 | basketball |
2 | Richard | 83 | 82 | Volleyball |
3 | Betty | 90 | 79 | football |
4 | Philip | 84 | 71 | Basketball |
5 | Anna | 85 | 86 | baseball |
但是,有時(shí)可能數(shù)據(jù)太大,而原數(shù)據(jù)后續(xù)不再使用。為了節(jié)省空間,想直接在原數(shù)據(jù)上改動(dòng)。應(yīng)該怎么辦呢?
只要在 sort_values() 函數(shù)中設(shè)置 inplace=True。
df_col.sort_values(by='course2',inplace=True) df_col
Name | course1 | course2 | sport | |
---|---|---|---|---|
4 | Philip | 84 | 71 | Basketball |
3 | Betty | 90 | 79 | football |
2 | Richard | 83 | 82 | Volleyball |
5 | Anna | 85 | 86 | baseball |
1 | Paul | 85 | 90 | basketball |
二、 按行的值對(duì)數(shù)據(jù)排序
需要注意的是,這種情況只適用于各列數(shù)據(jù)類(lèi)型相同的情況,例如下面例子中的數(shù)據(jù),每一列數(shù)據(jù)都是數(shù)值型。而前面例子的數(shù)據(jù)既有數(shù)值型,又有字符型,無(wú)法按行的值排序。
df_row = pd.DataFrame({ 'course1':[91,85,90,84,92], 'course2':[72,81,76,71,79], 'course3':[93,85,88,94,86]}, index=['Paul','Richard', 'Betty', 'Philip','Anna']) df_row
course1 | course2 | course3 | |
---|---|---|---|
Paul | 91 | 72 | 93 |
Richard | 85 | 81 | 85 |
Betty | 90 | 76 | 88 |
Philip | 84 | 71 | 94 |
Anna | 92 | 79 | 86 |
按行的值排序時(shí),設(shè)置 by 參數(shù)為某行的 index 名,并且 axis=1。
df_sort=df_row.sort_values(by='Anna',axis=1) df_sort
course2 | course3 | course1 | |
---|---|---|---|
Paul | 72 | 93 | 91 |
Richard | 81 | 85 | 85 |
Betty | 76 | 88 | 90 |
Philip | 71 | 94 | 84 |
Anna | 79 | 86 | 92 |
按行值排序在 sort_values() 函數(shù)中設(shè)置 ascending, key, inplace 等參數(shù)的方式都與前面介紹的按列值排序相同。這里僅以按多行的值對(duì)數(shù)據(jù)排序?yàn)槔?/p>
df_sort=df_row.sort_values(by=['Richard','Paul'],axis=1,ascending=False) df_sort
course3 | course1 | course2 | |
---|---|---|---|
Paul | 93 | 91 | 72 |
Richard | 85 | 85 | 81 |
Betty | 88 | 90 | 76 |
Philip | 94 | 84 | 71 |
Anna | 86 | 92 | 79 |
參考
1.https://www.geeksforgeeks.org/sort-rows-or-columns-in-pandas-dataframe-based-on-values/#courses
2.https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sort_values.html
到此這篇關(guān)于pandas中按行或列的值對(duì)數(shù)據(jù)排序的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)pandas 按行或列的值對(duì)數(shù)據(jù)排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python數(shù)據(jù)分析Pandas?Dataframe排序操作
- Pandas數(shù)值排序 sort_values()的使用
- python?pandas?數(shù)據(jù)排序的幾種常用方法
- pandas.DataFrame Series排序的使用(sort_values,sort_index)
- pandas?dataframe按照列名給列排序三種方法
- Python使用pandas實(shí)現(xiàn)對(duì)數(shù)據(jù)進(jìn)行特定排序
- Python利用pandas對(duì)數(shù)據(jù)進(jìn)行特定排序
- pandas中DataFrame排序及分組排序的實(shí)現(xiàn)示例
- pandas中數(shù)據(jù)的排序與排名的具體使用
- Pandas排序和分組排名(sort和rank)的實(shí)現(xiàn)
相關(guān)文章
一個(gè)計(jì)算身份證號(hào)碼校驗(yàn)位的Python小程序
閑著無(wú)事,便想寫(xiě)個(gè)實(shí)用點(diǎn)的Python小程序,如何計(jì)算機(jī)身份證號(hào)碼的校驗(yàn)位,這樣的文章在網(wǎng)上一抓一大把,這里僅簡(jiǎn)單介紹下吧2014-08-08django組合搜索實(shí)現(xiàn)過(guò)程詳解(附代碼)
這篇文章主要介紹了django組合搜索實(shí)現(xiàn)過(guò)程詳解(附代碼),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Python開(kāi)發(fā)寶典CSV JSON數(shù)據(jù)處理技巧詳解
在Python中處理CSV和JSON數(shù)據(jù)時(shí),需要深入了解這兩種數(shù)據(jù)格式的讀取、寫(xiě)入、處理和轉(zhuǎn)換方法,下面將詳細(xì)介紹如何在Python中處理CSV和JSON數(shù)據(jù),并提供一些示例和最佳實(shí)踐2023-11-11對(duì)于Python異常處理慎用“except:pass”建議
這篇文章主要介紹了對(duì)于Python異常處理方法的建議,摘選自StackOverflow上的熱門(mén)問(wèn)題的回答,闡述了except:pass的使用時(shí)需要注意的地方,需要的朋友可以參考下2015-04-04Python中關(guān)于集合的介紹與常規(guī)操作解析
Python除了List、Tuple、Dict等常用數(shù)據(jù)類(lèi)型外,還有一種數(shù)據(jù)類(lèi)型叫做集合(set),集合的最大特點(diǎn)是:集合里邊的元素是不可重復(fù)的并且集合內(nèi)的元素還是無(wú)序的2021-09-09python計(jì)算列表內(nèi)各元素的個(gè)數(shù)實(shí)例
今天小編就為大家分享一篇python計(jì)算列表內(nèi)各元素的個(gè)數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06python中turtle庫(kù)的簡(jiǎn)單使用教程
這篇文章主要給大家介紹了關(guān)于python中turtle庫(kù)的簡(jiǎn)單使用教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11