pandas 層次化索引的實(shí)現(xiàn)方法
層次化索引是pandas的一項(xiàng)重要功能,它使你能在一個(gè)軸上擁有多個(gè)(兩個(gè)以上)索引級(jí)別。
創(chuàng)建一個(gè)Series,并用一個(gè)由列表或數(shù)組組成的列表作為索引。
data=Series(np.random.randn(10), index=[['a','a','a','b','b','b','c','c','d','d'], [1,2,3,1,2,3,1,2,2,3]]) data Out[6]: a 1 -2.842857 2 0.376199 3 -0.512978 b 1 0.225243 2 -1.242407 3 -0.663188 c 1 -0.149269 2 -1.079174 d 2 -0.952380 3 -1.113689 dtype: float64
這就是帶MultiIndex索引的Series的格式化輸出形式。索引之間的“間隔”表示“直接使用上面的標(biāo)簽”。
data.index Out[7]: MultiIndex(levels=[['a', 'b', 'c', 'd'], [1, 2, 3]], labels=[[0, 0, 0, 1, 1, 1, 2, 2, 3, 3], [0, 1, 2, 0, 1, 2, 0, 1, 1, 2]])
對(duì)于一個(gè)層次化索引的對(duì)象,選取數(shù)據(jù)子集的操作很簡(jiǎn)單:
data['b'] Out[8]: 1 0.225243 2 -1.242407 3 -0.663188 dtype: float64 data['b':'c'] Out[10]: b 1 0.225243 2 -1.242407 3 -0.663188 c 1 -0.149269 2 -1.079174 dtype: float64 data.ix[['b','d']] __main__:1: DeprecationWarning: .ix is deprecated. Please use .loc for label based indexing or .iloc for positional indexing See the documentation here: http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated Out[11]: b 1 0.225243 2 -1.242407 3 -0.663188 d 2 -0.952380 3 -1.113689 dtype: float64
甚至可以在“內(nèi)層”中進(jìn)行選?。?/p>
data[:,2] Out[12]: a 0.376199 b -1.242407 c -1.079174 d -0.952380 dtype: float64
層次化索引在數(shù)據(jù)重塑和基于分組的操作中扮演重要角色。
可以通過(guò)unstack方法被重新安排到一個(gè)DataFrame中:
data.unstack()
Out[13]:
1 2 3
a -2.842857 0.376199 -0.512978
b 0.225243 -1.242407 -0.663188
c -0.149269 -1.079174 NaN
d NaN -0.952380 -1.113689
#unstack的逆運(yùn)算是stack
data.unstack().stack()
Out[14]:
a 1 -2.842857
2 0.376199
3 -0.512978
b 1 0.225243
2 -1.242407
3 -0.663188
c 1 -0.149269
2 -1.079174
d 2 -0.952380
3 -1.113689
dtype: float64
對(duì)于DataFrame,每條軸都可以有分層索引:
frame=DataFrame(np.arange(12).reshape((4,3)), index=[['a','a','b','b'],[1,2,1,2]], columns=[['Ohio','Ohio','Colorado'], ['Green','Red','Green']]) frame Out[16]: Ohio Colorado Green Red Green a 1 0 1 2 2 3 4 5 b 1 6 7 8 2 9 10 11
各層都可以有名字。如果指定了名稱,它們會(huì)顯示在控制臺(tái)中(不要將索引名稱和軸標(biāo)簽混為一談?。?/p>
frame.index.names=['key1','key2'] frame.columns.names=['state','color'] frame Out[22]: state Ohio Colorado color Green Red Green key1 key2 a 1 0 1 2 2 3 4 5 b 1 6 7 8 2 9 10 11
由于有了分部的列索引,可以輕松選取列分組:
frame['Ohio'] Out[23]: color Green Red key1 key2 a 1 0 1 2 3 4 b 1 6 7 2 9 10
重排分級(jí)排序
有時(shí)需要重新調(diào)整某條軸上各級(jí)別的順序,或根據(jù)指定級(jí)別上的值對(duì)數(shù)據(jù)進(jìn)行排序。swaplevel接受兩個(gè)級(jí)別編號(hào)或名稱,并返回一個(gè)互換了級(jí)別的新對(duì)象(但數(shù)據(jù)不會(huì)發(fā)生變化):
frame.swaplevel('key1','key2')
Out[24]:
state Ohio Colorado
color Green Red Green
key2 key1
1 a 0 1 2
2 a 3 4 5
1 b 6 7 8
2 b 9 10 11
sortlevel則根據(jù)單個(gè)級(jí)別中的值對(duì)數(shù)據(jù)進(jìn)行排序。交換級(jí)別時(shí),常用得到sortlevel,這樣最終結(jié)果也是有序的了:
frame.swaplevel(0,1) Out[27]: state Ohio Colorado color Green Red Green key2 key1 1 a 0 1 2 2 a 3 4 5 1 b 6 7 8 2 b 9 10 11 #交換級(jí)別0,1(也就是key1,key2) #然后對(duì)axis=0進(jìn)行排序 frame.swaplevel(0,1).sortlevel(0) __main__:1: FutureWarning: sortlevel is deprecated, use sort_index(level= ...) Out[28]: state Ohio Colorado color Green Red Green key2 key1 1 a 0 1 2 b 6 7 8 2 a 3 4 5 b 9 10 11
根據(jù)級(jí)別匯總統(tǒng)計(jì)
有時(shí)需要重新調(diào)整某條軸上各級(jí)別的順序,或根據(jù)指定級(jí)別上的值對(duì)數(shù)據(jù)進(jìn)行排序。swaplevel接受兩個(gè)級(jí)別編號(hào)或名稱,并返回一個(gè)互換了級(jí)別的新對(duì)象(但數(shù)據(jù)不會(huì)發(fā)生變化):
frame.sum(level='key2') Out[29]: state Ohio Colorado color Green Red Green key2 1 6 8 10 2 12 14 16 frame.sum(level='color',axis=1) Out[30]: color Green Red key1 key2 a 1 2 1 2 8 4 b 1 14 7 2 20 10
使用DataFrame的列
將DataFrame的一個(gè)或多個(gè)列當(dāng)做行索引來(lái)用,或?qū)⑿兴饕兂蒁ataframe 的列。
frame=DataFrame({'a':range(7),'b':range(7,0,-1),
'c':['one','one','one','two','two','two','two'],
'd':[0,1,2,0,1,2,3]})
frame
Out[32]:
a b c d
0 0 7 one 0
1 1 6 one 1
2 2 5 one 2
3 3 4 two 0
4 4 3 two 1
5 5 2 two 2
6 6 1 two 3
DataFrame的set_index函數(shù)會(huì)將其一個(gè)或多個(gè)列轉(zhuǎn)換為行索引,并創(chuàng)建一個(gè)新的DataFrame:
frame2=frame.set_index(['c','d'])
frame2
Out[34]:
a b
c d
one 0 0 7
1 1 6
2 2 5
two 0 3 4
1 4 3
2 5 2
3 6 1
默認(rèn)情況下,那些列會(huì)從DataFrame中移除,但也可以將其保留下來(lái):
frame.set_index(['c','d'],drop=False)
Out[35]:
a b c d
c d
one 0 0 7 one 0
1 1 6 one 1
2 2 5 one 2
two 0 3 4 two 0
1 4 3 two 1
2 5 2 two 2
3 6 1 two 3
reset_index的功能和set_index剛好相反,層次化索引的級(jí)別會(huì)被轉(zhuǎn)移到列里面:
frame2.reset_index() Out[36]: c d a b 0 one 0 0 7 1 one 1 1 6 2 one 2 2 5 3 two 0 3 4 4 two 1 4 3 5 two 2 5 2 6 two 3 6 1
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python實(shí)現(xiàn)半自動(dòng)化發(fā)送微信信息
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)半自動(dòng)化發(fā)送微信信息,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
Python-OpenCV實(shí)戰(zhàn):利用 KNN 算法識(shí)別手寫(xiě)數(shù)字
K-最近鄰(KNN)是監(jiān)督學(xué)習(xí)中最簡(jiǎn)單的算法之一,KNN可用于分類和回歸問(wèn)題。本文將為大家介紹的是通過(guò)KNN算法實(shí)現(xiàn)識(shí)別手寫(xiě)數(shù)字。文中的示例代碼介紹詳細(xì),需要的朋友可以參考一下2021-12-12
Python用Try語(yǔ)句捕獲異常的實(shí)例方法
在本篇文章中小編給大家整理了關(guān)于Python用Try語(yǔ)句如何捕獲異常的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們參考下。2019-06-06
python 對(duì)字典按照value進(jìn)行排序的方法
這篇文章主要介紹了python 對(duì)字典按照value進(jìn)行排序的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
Python使用Selenium獲取Web頁(yè)面信息的流程步驟
在 Web 自動(dòng)化測(cè)試和數(shù)據(jù)抓取中,獲取頁(yè)面信息是一個(gè)基本且重要的操作,通過(guò) Selenium,您可以輕松地獲取頁(yè)面的各種信息,這些信息不僅可以用于驗(yàn)證測(cè)試結(jié)果,還可以用于數(shù)據(jù)分析和處理,所以本文給大家介紹了Python使用Selenium獲取Web頁(yè)面信息的流程步驟2025-03-03

