PYTHON:過濾 PANDAS DATAFRAME 的 10 種方法_第1頁
PYTHON:過濾 PANDAS DATAFRAME 的 10 種方法_第2頁
PYTHON:過濾 PANDAS DATAFRAME 的 10 種方法_第3頁
PYTHON:過濾 PANDAS DATAFRAME 的 10 種方法_第4頁
PYTHON:過濾 PANDAS DATAFRAME 的 10 種方法_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

?在本文中,我們將介紹在Python中過濾pandas數(shù)據(jù)框的各種方法。數(shù)據(jù)過濾是最常見的數(shù)據(jù)操作之一。它類似于SQL中的WHERE子句,或者您必須在MSExcel中使用過濾器來根據(jù)某些條件選擇特定的行。在速度方面,python有一種高效的方式來執(zhí)行過濾和聚合。它有一個(gè)名為pandas的優(yōu)秀包,用于數(shù)據(jù)整理任務(wù)。Pandas建立在用C語言編寫的numpy包之上,這是一種低級(jí)語言。因此,使用

包進(jìn)行數(shù)據(jù)操作是處理大型數(shù)據(jù)集的快速而智能的方法。數(shù)據(jù)過濾示例它是預(yù)測建?;蛉魏螆?bào)告項(xiàng)目的數(shù)據(jù)準(zhǔn)備的最初始步驟之一。它也被稱為“子集數(shù)據(jù)”。請(qǐng)參閱下面的一些數(shù)據(jù)過濾示例。

導(dǎo)入數(shù)據(jù)在提交以下代碼之前,

請(qǐng)確保已安裝???????pandas包,您可以通過在Ipython控制臺(tái)中運(yùn)行!pipshowpandas語句來檢查它。如果沒有安裝,可以使用命令安裝!pipinstallpandas。我們將使用包含2013年從紐約起飛的航班詳細(xì)信息的數(shù)據(jù)集。該數(shù)據(jù)集有336776行和16列。請(qǐng)參閱下面的列名稱。要導(dǎo)入數(shù)據(jù)集,我們使用read_csv()pandas包中的函數(shù)。['year','month','day','dep_time','dep_delay','arr_time','arr_delay','carrier','tailnum','flight','origin','dest','air_time','distance','hour','minute']importpandasaspddf=pd.read_csv("/JackyP/testing/master/datasets/nycflights.csv",usecols=range(1,17))按列值過濾熊貓數(shù)據(jù)框選擇JetBlueAirways的航班詳情,該航班有2個(gè)字母的承運(yùn)人代碼B6,來自JFK機(jī)場方法一:DataFrame方式newdf=df[(df.origin=="JFK")&(df.carrier=="B6")]newdf.head()Out[23]:yearmonthdaydep_time...air_timedistancehourminute3201311544.0...183.015765.044.08201311557.0...140.09445.057.010201311558.0...149.010285.058.011201311558.0...158.010055.058.015201311559.0...44.01875.059.0[5rowsx16columns]過濾后的數(shù)據(jù)(子集化后)存儲(chǔ)在名為newdf.符號(hào)&指的是AND條件,這意味著同時(shí)滿足這兩個(gè)標(biāo)準(zhǔn)。這部分代碼(df.origin=="JFK")&(df.carrier=="B6")返回True/False。條件匹配時(shí)為真,條件不成立時(shí)為假。稍后它在df中傳遞并返回與True對(duì)應(yīng)的所有行。它返回4166行。方法二:查詢函數(shù)在pandas包中,有多種方法可以執(zhí)行過濾。上面的代碼也可以寫成如下所示的代碼。這種方法優(yōu)雅且更具可讀性,并且在指定列(變量)時(shí)無需每次都提及數(shù)據(jù)框名稱。newdf=df.query('origin=="JFK"&carrier=="B6"')\o"如何在查詢函數(shù)中傳遞變量"如何在查詢函數(shù)中傳遞變量方法三:loc函數(shù)loc是位置術(shù)語的縮寫。所有這3種方法都返回相同的輸出。這只是過濾行的不同方式。newdf=df.loc[(df.origin=="JFK")&(df.carrier=="B6")]按行和列位置過濾PandasDataframe假設(shè)您要按位置選擇特定行(比方說從第二行到第五行)。我們可以使用df.iloc[]相同的功能。Indexinginpythonstartsfromzero.df.iloc[0:5,]referstofirsttofifthrow(excludingendpoint6throwhere).df.iloc[0:5,]isequivalenttodf.iloc[:5,]df.iloc[:5,]#First5rowsdf.iloc[1:5,]#SecondtoFifthrowdf.iloc[5,0]#Sixthrowand1stcolumndf.iloc[1:5,0]#SecondtoFifthrow,firstcolumndf.iloc[1:5,:5]#SecondtoFifthrow,first5columnsdf.iloc[2:7,1:3]#ThirdtoSeventhrow,2ndand3rdcolumnloc和iloc函數(shù)的區(qū)別loc根據(jù)索引標(biāo)簽考慮行。而iloc根據(jù)索引中的位置考慮行,因此它只需要整數(shù)。讓我們創(chuàng)建一個(gè)示例數(shù)據(jù)以供說明importnumpyasnpx=pd.DataFrame({"col1":np.arange(1,20,2)},index=[9,8,7,6,0,1,2,3,4,5])col19183756709111213315417519iloc-索引位置x.iloc[0:5]Outputcol19183756709根據(jù)索引或行位置選擇行l(wèi)oc-索引標(biāo)簽x.loc[0:5]Outputcol109111213315417519根據(jù)索引標(biāo)簽選擇行

如何x.loc[0:5]返回6行(包括第6個(gè)元素的5行)?這是因?yàn)閘oc不根據(jù)索引位置產(chǎn)生輸出。它只考慮索引的標(biāo)簽,也可以是字母表,包括起點(diǎn)和終點(diǎn)。參考下面的例子。x=pd.DataFrame({"col1":range(1,5)},index=['a','b','c','d'])x.loc['a':'c']#equivalenttox.iloc[0:3]col1a1b2c3按行位置和列名稱過濾熊貓數(shù)據(jù)框在這里,我們選擇名為origin和dest的兩列的前五行。df.loc[df.index[0:5],["origin","dest"]]df.index返回索引標(biāo)簽。需要df.index[0:5]而不是0:5(沒有df.index),因?yàn)樗饕龢?biāo)簽并不總是按順序從0開始。它可以從任何數(shù)字開始,甚至可以有字母。請(qǐng)參考我們展示iloc和loc比較的示例。選擇列的多個(gè)值假設(shè)您想要包含始發(fā)地為JFK或LGA的所有航班詳細(xì)信息。#LongWaynewdf=df.loc[(df.origin=="JFK")|(df.origin=="LGA")]#SmartWaynewdf=df[df.origin.isin(["JFK","LGA"])]|暗示OR條件,這意味著任何條件都成立。isin()類似于SAS和R中的IN運(yùn)算符,它可以取很多值并應(yīng)用OR條件。確保在列表[]中指定值。選擇列值不等于特定值的行在此示例中,我們將刪除起點(diǎn)來自JFK的所有航班詳細(xì)信息。!=暗示不等于。newdf=df.loc[(df.origin!="JFK")&(df.carrier=="B6")]讓我們通過查看newdf中列origin的唯一值來檢查上面的代碼行是否正常工作。pd.unique(newdf.origin)['LGA','EWR']如何否定整個(gè)條件波浪號(hào)~用于否定條件。它等同于SAS和R中的NOT運(yùn)算符。newdf=df[~((df.origin=="JFK")&(df.carrier=="B6"))]在PandasDataframe中選擇非缺失數(shù)據(jù)通過使用notnull()函數(shù),您可以排除或刪除NA和NAN值。在下面的示例中,我們從原始列中刪除缺失值。由于此數(shù)據(jù)框不包含任何空白值,因此您會(huì)在newdf中找到相同數(shù)量的行。newdf=df[df.origin.notnull()]在PandasDataframe中過濾字符串處理文本數(shù)據(jù)通常被認(rèn)為是棘手的。但是python使處理字符或字符串列變得更容易。例如,讓我們準(zhǔn)備一個(gè)假數(shù)據(jù)。importpandasaspddf=pd.DataFrame({"var1":["AA_2","B_1","C_2","A_2"]})var10AA_21B_12C_23A_2選擇值以字母“A”開頭的行通過使用.str,您可以啟用字符串函數(shù)并可以應(yīng)用于pandas數(shù)據(jù)框。str[0]表示第一個(gè)字母。df[df['var1'].str[0]=='A']過濾字符串長度大于3的行l(wèi)en()函數(shù)計(jì)算可迭代的長度。df[df['var1'].str.len()>3]選擇包含字母A或B的字符串contains()功能類似于SQL和SAS中的LIKE語句。您可以通過在contains()函數(shù)中提及模式來對(duì)數(shù)據(jù)進(jìn)行子集化。df[df['var1'].str.contains('A|B')]Outputvar10AA_21B_13A_2過濾時(shí)處理列名中的空格讓我們重命名列var1,在var1之間留一個(gè)空格我們可以使用重命名函數(shù)重命名它。df.rename(columns={'var1':'var1'},inplace=True)通過使用反引號(hào),``

我們可以包含有空格的列。請(qǐng)參閱下面的示例代碼。newdf=df.query("`var1`=='AA_2'")pandas包的0.25

版本支持反引號(hào)。在控制臺(tái)中運(yùn)行此命令以檢查pandas版本!pipshowpandas如果您的版本早于0.25版,則可以使用此命令升級(jí)它!pipinstall--upgradepandas--user如何在不使用pandas包的情況下過濾數(shù)據(jù)您可以使用純python方法執(zhí)行過濾,而不依賴于pandas包。警告:下面顯示的過濾方法不是有效的方法。展示以下方法的主要目的是展示如何在不使用pandas包的情況下進(jìn)行子集化。在您的實(shí)際項(xiàng)目中,您應(yīng)該使用pandas的內(nèi)置函數(shù)(query()、loc[]、iloc[]),這些函數(shù)在上面已經(jīng)解釋過了。我們不需要?jiǎng)?chuàng)建數(shù)據(jù)框來存儲(chǔ)數(shù)據(jù)。我們可以將其存儲(chǔ)在列表數(shù)據(jù)結(jié)構(gòu)中。lst_df包含從CSV文件導(dǎo)入的航班數(shù)據(jù)。importcsvimportrequestsresponse=requests.get('https://dyurovsky.github.io/psyc201/data/lab2/nycflights.csv').textlines=response.splitlines()d=csv.DictReader(lines)lst_df=list(d)用于過濾的Lambda方法Lambda是定義用戶定義函數(shù)的另一種方式。通過使用lambda,您可以在一行代碼中定義函數(shù)。l1=list(filter(lambdax:x["origin"]=='JFK'andx["carrier"]=='B6',lst_df))如果你想知道如何在數(shù)據(jù)幀上使用這個(gè)lambda函數(shù),你可以提交下面的代碼。newdf=df[df.apply(lambdax:x["origin"]=='JFK'andx["carrier"]=='B6',axis=1)]用于過濾的列表理解方法列表推導(dǎo)式是lambda函數(shù)的替代方法,使代碼更具可讀性。l2=list(xforxinlst_dfifx["origin"]=='JFK'andx["carrier"]=='B6')您可以像下面所示的方式在數(shù)據(jù)框上使用列表理解。newdf=df.iloc[[indexforindex,rowindf.iterrows()ifrow['origin']

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論