
索引和切片操作是最基本最常用的數(shù)據(jù)處理操作,Pandas中的索引和切片操作基于Python的語言特性,支持類似于numpy中的操作,也可以使用行標(biāo)簽、列標(biāo)簽以及行標(biāo)簽與列標(biāo)簽的組合來進(jìn)行索引和切片操作。
前面介紹DataFrame和Series的文章中,代碼是在Pycharm中編寫的,本文和后面介紹Pandas的文章,代碼會(huì)優(yōu)先在Jupyter Notebook中編寫。Jupyter Notebook的安裝可以參考:Jupyter Notebook的安裝和使用
一、數(shù)據(jù)讀取
數(shù)據(jù)文件是600519.csv,將此文件放到代碼同級(jí)目錄下,從文件中讀取出數(shù)據(jù)。

為了避免數(shù)據(jù)量太大,只取了前5行數(shù)據(jù)。查看讀取的數(shù)據(jù),列還是很多,為了讓數(shù)據(jù)再精簡(jiǎn)一點(diǎn),接下來將后面幾列刪除。默認(rèn)的行索引是數(shù)值索引,為了方便后面演示索引操作,設(shè)置日期為索引。

處理后的數(shù)據(jù)如上圖,這樣看起來簡(jiǎn)潔了很多。
二、讀取一列數(shù)據(jù)或一行數(shù)據(jù)

獲取DataFrame中的一列數(shù)據(jù)有兩種方式,第一種是用 data['列索引'] ,如 data['收盤價(jià)'] 可以獲取收盤價(jià)這一列的數(shù)據(jù)。第二種是 data.列索引 的方式,如 data.收盤價(jià) 與 data['收盤價(jià)'] 的結(jié)果相同。
第一種方式是通用的方式,對(duì)于任意DataFrame都適用。第二種方式除了支持英文的索引名,也支持中文的索引名,但是如果英文的索引名與Python關(guān)鍵字(如class,list)同名,會(huì)報(bào)錯(cuò),只能用第一種方式來取數(shù)據(jù)。

獲取DataFrame中的一行數(shù)據(jù)時(shí),不能直接用 data['行索引'] 或 data.行索引 的方式。
獲取行數(shù)據(jù)也有兩種方式,需要借助loc屬性或iloc屬性。loc屬性基于行索引名獲取數(shù)據(jù),用法為 data.loc['行索引'] ,如 data.loc['2021-02-19'] 可以獲取2021年2月19日的交易數(shù)據(jù)。iloc屬性基于數(shù)值索引獲取數(shù)據(jù),用法為 data.iloc[數(shù)值] ,如 data.iloc[0] 是獲取DataFrame中的第一行數(shù)據(jù),與 data.loc['2021-02-19'] 結(jié)果相同。
三、讀取指定位置的數(shù)據(jù)

Pandas中獲取指定位置數(shù)據(jù)的索引方式默認(rèn)是“先列后行”,這與numpy中ndarray的索引方式“先行后列”是相反的。在Pandas中,取數(shù)據(jù)的邏輯通常是先獲取某一列數(shù)據(jù),然后再取這列數(shù)據(jù)中的某個(gè)數(shù)據(jù),所以默認(rèn)采用了“先列后行”的方式,如果順序反了會(huì)報(bào)錯(cuò)。

除了用“先列后行”的方式獲取數(shù)據(jù),如果想用“先行后列”的方式獲取數(shù)據(jù),可以借助loc屬性或iloc屬性來實(shí)現(xiàn)。loc屬性是基于索引名來獲取數(shù)據(jù)的,在loc中的行索引和列索引都要使用索引名,iloc屬性是基于數(shù)值索引來獲取數(shù)據(jù)的,在iloc中的行索引和列索引都要使用數(shù)值索引。同時(shí),loc屬性和iloc屬性都只支持“先行后列”,順序不能反。
四、DataFrame的索引轉(zhuǎn)換

在使用loc屬性和iloc屬性時(shí),行索引和列索引必須同時(shí)為索引名或同時(shí)為數(shù)值索引,所以,經(jīng)常需要對(duì)索引名和數(shù)值索引互相轉(zhuǎn)換。
使用DataFrame的index屬性和columns屬性可以得到行索引和列索引,在后面?zhèn)魅雽?duì)應(yīng)的數(shù)值就可以將數(shù)值索引轉(zhuǎn)換成索引名。鏈?zhǔn)秸{(diào)用index屬性和columns屬性的get_indexer()方法,就可以將索引名轉(zhuǎn)換成數(shù)值索引,get_indexer()中傳入需要轉(zhuǎn)換的索引名列表,即使只轉(zhuǎn)換一個(gè)索引名,也要用列表的方式傳入。

如果需要同時(shí)轉(zhuǎn)換多個(gè)索引名,可以在列表中添加,列表中的順序可以不遵守index和columns的先后順序,返回結(jié)果是一一對(duì)應(yīng)的數(shù)值索引數(shù)組。
五、切片

DataFrame的切片操作也要使用loc屬性和iloc屬性,不能直接用 data[:][:] 或 data[:, :] 的方式。loc中傳入需要切片的行索引和列索引的索引名,iloc中傳入需要切片的行索引和列索引的數(shù)值索引范圍。
使用iloc進(jìn)行切片操作時(shí),切片規(guī)則與Python基本的切片規(guī)則相同,傳入的切片索引是左閉右開的(包含起始值,不包含結(jié)束值)。

上面的索引互相轉(zhuǎn)換方法,可以靈活地在切片中使用,在使用loc時(shí)將數(shù)值索引轉(zhuǎn)換成索引名,在使用iloc時(shí)將索引名轉(zhuǎn)換成數(shù)值索引。
以上就是Pandas中的索引和切片基本操作介紹,如果需要獲取數(shù)據(jù)和代碼,可以點(diǎn)擊關(guān)注公眾號(hào)“Python碎片”,然后在后臺(tái)回復(fù)“pandas03”關(guān)鍵字獲取本文代碼和數(shù)據(jù)。