最簡單的辦法就是需要指定列表排序方法中的參數“key”。代碼如下:
專注于為中小企業提供成都做網站、成都網站建設、成都外貿網站建設服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業沙洋免費做網站提供優質的服務。我們立足成都,凝聚了一批互聯網行業人才,有力地推動了1000+企業的穩健成長,幫助中小企業通過網站建設實現規模擴充和轉變。
第一種:
stu=[['john',79],['mame',96],['herry',85],['lili',95],['ziling',63]]
def takeSecond(elem):
return elem[1]
stu.sort(key=takeSecond,,reverse=True)
print(stu)
第二種:
stu=[['john',79],['mame',96],['herry',85],['lili',95],['ziling',63]]
s=sorted(stu,key=lambda student: student[1],,reverse=True)
print(s)
將Excel中的的數據讀入數據框架DataFrame后,可以非常方便的進行各種數據處理。
21.1 列間求和
求總分(總分=語文+數學+英語)
對于上一章所提到的學生成績表,僅用一個語句即可完成總分計算,并填充。
df['總分']=df['語文']+df['數學']+df['英語']
完整代碼如下:
from pandas import read_excel
file='d:/student.xlsx' #見第18章表18-1
df=read_excel(file,sheet_name=0,converters={'學號':str})
df['總分']=df['語文']+df['數學']+df['英語']
print(df.head()) #df.head()的作用是僅顯示5行記錄。
運行結果如下:
序號 學號 姓名 年級 班級 語文 數學 英語 總分 名次
0 1 070101 王博宇 NaN NaN 84 71 93 248 NaN
1 2 070102 陳冠濤 NaN NaN 89 89 89 267 NaN
2 3 070103 李文博 NaN NaN 89 72 76 237 NaN
3 4 070204 姜海燕 NaN NaN 89 89 89 267 NaN
4 5 070205 林若溪 NaN NaN 91 95 83 269 NaN
21.2替換
既可以將對滿足條件的行和列的數據替換,也可以對整個集合的數據按照條件進行替換。
df['總分'].replace(310,'x',inplace=True)
將總分列的數值“310”替換為“x”。inplace=True表示改變原數據。
df.replace(76,0,inplace=True)
將整個DataFrame中的數值“76”替換為“0”。
df.replace([98,76,99],0,inplace=True)
將整個DataFrame中的數值“98,76,99”一次替換為“0”。
21.2排序
既可以將某一列作為關鍵字段排序,也可以將幾個列分別作為主、次關鍵字段進行排序。排序既可以按升序排序,也可以按降序排序。
函數sort_values()的語法格式如下:
df.sort_values(by=[“col1”,”col2”,......,”coln”],ascending=False)
其中,coln表示列名,也可以是列名的列表;ascending表示排序方式,值為True表示升序,可以省缺,值為False表示降序。
如:
df=df.sort_values(by=['總分'],ascending=False)
表示按照“總分”從高到低排序。
df=df.sort_values(by=['總分','語文'],ascending=False)
表示按照“總分”從高到低排序,若“總分”相同,再按照“語文”成績從高到低排序。
21.3 字段截取
函數slice()可以從某列中截取字符串。格式如下:
slice(start,stop)
其中,start表示開始位置;stop表示結束位置
例:
df['年級']=df['學號'].str.slice(0,2)
通過此語句可以截取學號字段的第1、2個字符,并賦值給年級字段。
21.4 記錄抽取
可以抽取滿足條件的記錄。
例:抽取總分300的記錄。
df[df.總分300]
抽取總分在300到310之間(包括300和310)的記錄。
df[df.總分.between(306,310)]
抽取學號中包含“0803”的記錄。這樣可以非常方便的抽取某個班的信息。
df[df.學號.str.contains('0803',na=False)]
此處的na=False,含義是如遇到NaN這樣的數據,直接做不匹配處理。
21.5修改記錄
1、整列替換
我們在前面已經給整列填充過數據,填充時原來的數據就被覆蓋了。
即如下語句:
df['總分']=df['語文']+df['數學']+df['英語']
2、個別修改
如將值‘99’替換為值‘100’,可用如下語句:
df.replace('99','100')
將指定列的值替,如將語文列和英語列的值‘99’替換為值‘100’,可用如下語句:
df.replace({'語文':99,'英語':99},100)
可用如下程序去驗證:
from pandas import read_excel
file='d:/student.xlsx'
df=read_excel(file,sheet_name=0,converters={'學號':str})
print(df[(df.語文==99) |(df.英語==99)])
df=df.replace({'語文':99,'英語':99},100)
print(df[(df.語文==99) |(df.英語==99)])
運行結果為:
序號 學號 姓名 年級 班級 語文 數學 英語 總分 名次
28 29 090802 丁能通 09 NaN 119 120 99 338 NaN
29 30 090203 沈丹妮 09 NaN 109 108 99 316 NaN
Empty DataFrame
Columns: [序號, 學號, 姓名, 年級, 班級, 語文, 數學, 英語, 總分, 名次]
Index: []
可以看出,第一個print()語句輸出的結果中滿足條件“語文或英語為99分”的有兩條記錄,替換語句執行以后,df中再沒有滿足條件“語文或英語為99分”的記錄了。
21.6記錄合并
函數concat()的格式如下:
concat([dataFrame1,dataFrame2,......],ignore_index=True)
其中,dataFrame1等表示要合并的DataFrame數據集合;ignore_index=True表示合并之后的重新建立索引。其返回值也是DataFrame類型。
concat()函數和append()函數的功能非常相似。
例:
import pandas #導入pandas模塊
from pandas import read_excel #導入read_execel
file='d:/student.xlsx' #變量file表示文件路徑,注意'/'的用法 數據見第18章表18-1
df=read_excel(file,sheet_name=0,converters={'學號':str})
# 將Excel文件導入到DataFrame變量中
df=df[:5] #截取df的前5個記錄
print(df) #輸出df
df1=df[:3] #截取df的前3個記錄存入df1中
df2=df[3:5] #截取df的最后2個記錄存入df2中
df3=pandas.concat([df2,df1]) #將df2與df1合并存入df3中
print(df3) #輸出df3
運行結果如下:
序號 學號 姓名 年級 班級 語文 數學 英語 總分 名次
0 1 070101 王博宇 NaN NaN 84 71 93 NaN NaN
1 2 070102 陳冠濤 NaN NaN 89 89 89 NaN NaN
2 3 070103 李文博 NaN NaN 89 72 76 NaN NaN
3 4 070204 姜海燕 NaN NaN 89 89 89 NaN NaN
4 5 070205 林若溪 NaN NaN 91 95 83 NaN NaN
序號 學號 姓名 年級 班級 語文 數學 英語 總分 名次
3 4 070204 姜海燕 NaN NaN 89 89 89 NaN NaN
4 5 070205 林若溪 NaN NaN 91 95 83 NaN NaN
0 1 070101 王博宇 NaN NaN 84 71 93 NaN NaN
1 2 070102 陳冠濤 NaN NaN 89 89 89 NaN NaN
2 3 070103 李文博 NaN NaN 89 72 76 NaN NaN
由于合并時是將df1合并到df2中,可以看出,索引仍然保持原來的狀態。
21.7統計次數
可以用如下方法統計出某個值在某行或者某個范圍出現的次數。
from pandas import read_excel
file='d:/student.xlsx'
df=read_excel(file,sheet_name=0,converters={'學號':str})
df=df[:5]
print(df)
print(df['語文'].value_counts())
輸出結果如下:
序號 學號 姓名 年級 班級 語文 數學 英語 總分 名次
0 1 070101 王博宇 NaN NaN 84 71 93 NaN NaN
1 2 070102 陳冠濤 NaN NaN 89 89 89 NaN NaN
2 3 070103 李文博 NaN NaN 89 72 76 NaN NaN
3 4 070204 姜海燕 NaN NaN 89 89 89 NaN NaN
4 5 070205 林若溪 NaN NaN 91 95 83 NaN NaN
89 3
84 1
91 1
Name: 語文, dtype: int64
可以看出,通過value_counts()函數可以統計出列中各值出現的次數。
value_counts()函數的參數還有 :
ascending,當ascending=True時升序排列,當ascending=False時升序排列(此時該參數可省缺);
normalize,當normalize=True時,顯示的不再是各值出現的次數,而是占比。
將上例中的語句print(df['語文'].value_counts())改為:
print(df['語文'].value_counts(ascending=True,normalize=True))
則輸出結果變成了:
91 0.2
84 0.2
89 0.6
Name: 語文, dtype: float64
21.8按值查找
print(df['語文'].isin([84,91]))
它的作用是查找‘語文’列中值和isin所指的列表中元素一致的記錄,如果找到結果為True,否則為False。
輸出結果:
0 True
1 False
2 False
3 False
4 True
Name: 語文, dtype: bool
21.9數據分區
根據某個分區標準,將數據按照所屬區域進行劃分,并用相應的標簽表示,可以用cut()方法來實現。
語法格式如下:
cut(series, bins, right=True, labels=NULL)
其中:
series表示需要分組的數據;
bins表示分組的依據,是一個列表,其元素為劃分分區的邊界值,如[0,72,96,120],就是劃分3個分區,即0~72、72~96、96~120,默認的是“左包右不包”;
right表示分組時右邊是否閉合;
labels表示分組的自定義標簽,也可以不重新定義。
下面對上述學生成績表中的語文成績進行分組,并增加一個新的列“語文等級”。
import pandas as pd
from pandas import read_excel #導入read_execel
file='d:/student.xlsx'
df=read_excel(file,sheet_name=0,converters={'學號':str})
df['年級']=df['學號'].str.slice(0,2)
df['班級']=df['學號'].str.slice(0,4)
df.總分=df.語文+df.數學+df.英語
bins=[0,72,96,max(df.語文)+1] #
lab=['不及格','及格','優秀']
grade=pd.cut(df.語文,bins,right=False,labels=lab)
df['語文等級']=grade
print(df.head())
print("語文成績分等級統計結果:")
print(df['語文等級'].value_counts())
運行結果如下:
序號 學號 姓名 年級 班級 語文 數學 英語 總分 語文等級
0 1 070101 王博宇 07 0701 84 71 93 248 及格
1 2 070102 陳冠濤 07 0701 89 89 89 267 及格
2 3 070103 李文博 07 0701 89 72 76 237 及格
3 4 070204 姜海燕 07 0702 89 89 89 267 及格
4 5 070205 林若溪 07 0702 91 95 83 269 及格
語文成績分等級統計結果:
及格 17
優秀 10
不及格 4
Name: 語文等級, dtype: int64
Python使用過程隨記~
sort()函數與sorted()函數的區別:
sort是list的方法,而sorted可以對所有可迭代對象進行排序(字典,元組等);
sort方法返回的是對已經存在的列表進行操作,會改變原有列表的值;而sorted是新建一個新的list,不改變原有的值。
一.list sort()方法
語法:
key:主要是用來比較的參數,指定對象中的一個對象用來進行排序。
reserve:默認值為reserve=False升序,reserve=True降序。
無返回值,通常如下:
指定列表中的元素排序來輸出:
二.sorted
語法:
iterable:可迭代對象
key:主要是用來比較的參數,指定對象中的一個對象用來進行排序。
reserve:默認值為reserve=False升序,reserve=True降序。
利用key進行倒序排序:
或者通過reserve參數,與sort()函數一致。
若列表內元素為字典/元組,還可以通過key指定來排序:
進行一個簡單的升序排列直接調用sorted()函數,函數將會返回一個排序后的列表:
sorted函數不會改變原有的list,而是返回一個新的排好序的list
如果你想使用就地排序,也就是改變原list的內容,那么可以使用list.sort()的方法,這個方法的返回值是None。
另一個區別是,list.sort()方法只是list也就是列表類型的方法,只可以在列表類型上調用。而sorted方法則是可以接受任何可迭代對象。
list.sort()和sorted()函數都有一個key參數,可以用來指定一個函數來確定排序的一個優先級。比如,這個例子就是根據大小寫的優先級進行排序:
key參數的值應該是一個函數,這個函數接受一個參數然后返回以一個key,這個key就被用作進行排序。這個方法很高效,因為對于每一個輸入的記錄只需要調用一次key函數。
一個常用的場景就是當我們需要對一個復雜對象的某些屬性進行排序時:
再如:
前面我們看到的利用key-function來自定義排序,同時Python也可以通過operator庫來自定義排序,而且通常這種方法更好理解并且效率更高。
operator庫提供了 itemgetter(), attrgetter(), and a methodcaller()三個函數
同時還支持多層排序
list.sort()和sorted()都有一個boolean類型的reverse參數,可以用來指定升序和降序排列,默認為false,也就是升序排序,如果需要降序排列,則需將reverse參數指定為true。
排序的穩定性指,有相同key值的多個記錄進行排序之后,原始的前后關系保持不變
我們可以看到python中的排序是穩定的。
我們可以利用這個穩定的特性來進行一些復雜的排序步驟,比如,我們將學生的數據先按成績降序然后年齡升序。當排序是穩定的時候,我們可以先將年齡升序,再將成績降序會得到相同的結果。
傳統的DSU(Decorate-Sort-Undecorate)的排序方法主要有三個步驟:
因為元組是按字典序比較的,比較完grade之后,會繼續比較i。
添加index的i值不是必須的,但是添加i值有以下好處:
現在python3提供了key-function,所以DSU方法已經不常用了
python2.x版本中,是利用cmp參數自定義排序。
python3.x已經將這個方法移除了,但是我們還是有必要了解一下cmp參數
cmp參數的使用方法就是指定一個函數,自定義排序的規則,和java等其他語言很類似
也可以反序排列
python3.x中可以用如下方式:
文章題目:python成績排序函數 Python的排序函數
網站網址:http://vcdvsql.cn/article20/hehgco.html
成都網站建設公司_創新互聯,為您提供軟件開發、移動網站建設、網站維護、全網營銷推廣、網站排名、小程序開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯