到目前為止我們關(guān)注的是保存在Pandas Series和DataFrame中的一維和二維數(shù)據(jù)藕各。
通常超越二維的數(shù)據(jù)舆瘪,即用兩個(gè)以上鍵值索引的數(shù)據(jù)也是很有用的片效。
盡管Pandas提供了“Panel”和“Panel4D”對(duì)象來(lái)本地處理3維和4維數(shù)據(jù),實(shí)踐中更常用的方式是在單個(gè)索引中使用層次化索引(也叫多級(jí)索引)來(lái)包含多個(gè)索引英古。
以這種方式淀衣,高維數(shù)據(jù)可以被緊湊的表示在我們熟悉的一維Series和二維DataFrame對(duì)象中。
在這部分召调,我們將探索直接創(chuàng)建多級(jí)索引對(duì)象膨桥,仔細(xì)考慮對(duì)多級(jí)索引數(shù)據(jù)的索引,切片和計(jì)算統(tǒng)計(jì)某残,還會(huì)介紹對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單和層次化索引轉(zhuǎn)換有用的函數(shù)国撵。
我們以標(biāo)準(zhǔn)的導(dǎo)入開(kāi)始:
import pandas as pd
import numpy as np
多級(jí)索引Series
讓我們由考慮如果使用一維Series表達(dá)二維數(shù)據(jù)開(kāi)始陵吸。具體講玻墅,我們考慮那種帶有字母和數(shù)字鍵值數(shù)據(jù)的Series。
不好的方法
假設(shè)你想要追蹤兩個(gè)不同年份的州數(shù)據(jù)壮虫。使用我們已經(jīng)講過(guò)的Pandas工具澳厢,你可能首先想到的是簡(jiǎn)單的使用Python元組作為鍵值:
index = [('California', 2000), ('California', 2010),
('New York', 2000), ('New York', 2010),
('Texas', 2000), ('Texas', 2010)]
populations = [33871648, 37253956,
18976457, 19378102,
20851820, 25145561]
pop = pd.Series(populations, index=index)
pop
(California, 2000) 33871648
(California, 2010) 37253956
(New York, 2000) 18976457
(New York, 2010) 19378102
(Texas, 2000) 20851820
(Texas, 2010) 25145561
dtype: int64
使用這種索引方案环础,你可以直接基于多索引進(jìn)行Series的索引和切片操作:
pop[('California', 2010):('Texas', 2000)]
(California, 2010) 37253956
(New York, 2000) 18976457
(New York, 2010) 19378102
(Texas, 2000) 20851820
dtype: int64
但是便利也就到此為止了。例如剩拢,如果你需要選取所有2010年的值线得,你需要使用混亂(有可能緩慢的)方法才能實(shí)現(xiàn):
pop[[i for i in pop.index if i[1] == 2010]]
(California, 2010) 37253956
(New York, 2010) 19378102
(Texas, 2010) 25145561
dtype: int64
這種方法得到了期待的結(jié)果,但它并不像我們喜愛(ài)的Pandas切片操作那樣簡(jiǎn)潔(在數(shù)據(jù)很大時(shí)徐伐,效率也不高)贯钩。
較好的方法:Pandas多級(jí)索引
幸運(yùn)的是,Pandas提供了一種更好的方法办素。我們基于元組的索引本質(zhì)上來(lái)說(shuō)是初級(jí)的多索引角雷,Pandas的多級(jí)索引類(lèi)型帶來(lái)我們所希望的操作類(lèi)型。我們可以像下面這樣通過(guò)元組創(chuàng)建多索引:
index = pd.MultiIndex.from_tuples(index)
index
MultiIndex(levels=[['California', 'New York', 'Texas'], [2000, 2010]],
labels=[[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]])
注意MultiIndex包含多個(gè)索引級(jí)別性穿,在這個(gè)例子中勺三,有州名稱(chēng)和年份,以及多個(gè)為每個(gè)數(shù)據(jù)點(diǎn)都記錄層級(jí)的標(biāo)簽需曾。
pop = pop.reindex(index)
pop
California 2000 33871648
2010 37253956
New York 2000 18976457
2010 19378102
Texas 2000 20851820
2010 25145561
dtype: int64
這里Series結(jié)果的頭兩列顯示的是多索引值吗坚,第三行顯示的是數(shù)據(jù)。注意第一列里面一些條目是空的:在多索引表達(dá)是呆万,空位表示那里面的值與上一行的值一樣商源。
現(xiàn)在訪問(wèn)第二個(gè)索引是2010的所有數(shù)據(jù),我們就可以簡(jiǎn)單的使用Pandas切片記號(hào):
pop[:, 2010]
California 37253956
New York 19378102
Texas 25145561
dtype: int64
結(jié)果是帶有我們想要鍵值的單索引數(shù)組谋减。跟我們開(kāi)始時(shí)自制的基于元組的解決方法相比炊汹,現(xiàn)在的語(yǔ)法更簡(jiǎn)潔(執(zhí)行效率也更高)。我們將會(huì)更深入的討論這類(lèi)在層級(jí)索引數(shù)據(jù)上面索引操作逃顶。
多級(jí)索引作為另外的維度
這里你也許會(huì)注意到一點(diǎn)別的東西:我們可以很容易的使用帶有索引和列標(biāo)簽的DataFrame來(lái)存儲(chǔ)同樣的數(shù)據(jù)讨便。實(shí)際上,Pandas在設(shè)計(jì)時(shí)也想到了這種對(duì)等性以政。unstack()方法會(huì)快速的將多層索引Series轉(zhuǎn)換成常用的DataFrame:
pop_df = pop.unstack()
pop_df
2000 | 2010 | |
---|---|---|
California | 33871648 | 37253956 |
New York | 18976457 | 19378102 |
Texas | 20851820 | 25145561 |
自然而然霸褒,stack()方法提供了相反的操作:
pop_df.stack()
California 2000 33871648
2010 37253956
New York 2000 18976457
2010 19378102
Texas 2000 20851820
2010 25145561
dtype: int64
看到這,您可能奇怪為什么我們還要麻煩的使用層級(jí)索引盈蛮。原因很簡(jiǎn)單:就如我們可以用一維Series的多層級(jí)索引來(lái)表示二維數(shù)據(jù)一樣废菱,我們也能使用Series或DataFrame來(lái)表示三維或多維數(shù)據(jù)。多級(jí)索引中每個(gè)額外的層級(jí)代表數(shù)據(jù)的一個(gè)維度;這個(gè)屬性為我們可以表示的數(shù)據(jù)類(lèi)型帶來(lái)許多靈活性抖誉。具體來(lái)講殊轴,我們想要添加一列來(lái)表示每年的人口統(tǒng)計(jì)數(shù)據(jù)(比如,小于18歲的人口數(shù))袒炉;使用多級(jí)索引旁理,就是簡(jiǎn)單的在DataFrame中添加一列:
pop_df = pd.DataFrame({'total': pop,
'under18': [9267089, 9284094,
4687374, 4318033,
5906301, 6879014]})
pop_df
total | under18 | |
---|---|---|
California 2000 | 33871648 | 9267089 |
2010 | 37253956 | 9284094 |
New York 2000 | 18976457 | 4687374 |
2010 | 19378102 | 4318033 |
Texas 2000 | 20851820 | 5906301 |
2010 | 25145561 | 6879014 |
另外,所有ufuncs和其他在Operating on Data in Pandas 討論的功能都能在層次化索引上工作的很好我磁。我們用上面的數(shù)據(jù)孽文,來(lái)計(jì)算每年低于18歲的人口比例:
f_u18 = pop_df['under18'] / pop_df['total']
f_u18.unstack()
2000 | 2010 | |
---|---|---|
California | 0.273594 | 0.249211 |
New York | 0.247010 | 0.222831 |
Texas | 0.283251 | 0.273568 |
這使我們可以方便和快捷操縱高維數(shù)據(jù)驻襟。
多級(jí)索引的創(chuàng)建方法
為Series和DataFrame創(chuàng)建多級(jí)索引最直接的方法就是傳遞兩個(gè)或多個(gè)索引數(shù)組給構(gòu)造器。例如:
df = pd.DataFrame(np.random.rand(4, 2),
index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],
columns=['data1', 'data2'])
df
data1 | data2 | |
---|---|---|
a 1 | 0.554233 | 0.356072 |
2 | 0.925244 | 0.219474 |
b 1 | 0.441759 | 0.610054 |
2 | 0.171495 | 0.886688 |
創(chuàng)建索引的工作由后臺(tái)去做芋哭。
類(lèi)似的沉衣,如果你傳遞一個(gè)帶有適當(dāng)元組作為鍵值的字典的話(huà),Pandas將會(huì)自動(dòng)識(shí)別并且使用多級(jí)索引:
data = {('California', 2000): 33871648,
('California', 2010): 37253956,
('Texas', 2000): 20851820,
('Texas', 2010): 25145561,
('New York', 2000): 18976457,
('New York', 2010): 19378102}
pd.Series(data)
California 2000 33871648
2010 37253956
New York 2000 18976457
2010 19378102
Texas 2000 20851820
2010 25145561
dtype: int64
然而减牺,有時(shí)候明確的創(chuàng)建多級(jí)索引也是很有用的豌习;我們來(lái)看幾個(gè)用法。
顯示索引構(gòu)造器
如何構(gòu)造索引有更多的靈活性拔疚,你可以使用類(lèi)構(gòu)造方法pd.MultiIndex斑鸦。例如,如我們之前做的草雕,可以通過(guò)給出了各級(jí)索引值的數(shù)組列表來(lái)構(gòu)建多級(jí)索引:
pd.MultiIndex.from_arrays([['a', 'a', 'b', 'b'], [1, 2, 1, 2]])
MultiIndex(levels=[['a', 'b'], [1, 2]],
labels=[[0, 0, 1, 1], [0, 1, 0, 1]])
也可以通過(guò)已經(jīng)給出每個(gè)點(diǎn)多級(jí)索引值的元組列表來(lái)構(gòu)建:
pd.MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 1), ('b', 2)])
MultiIndex(levels=[['a', 'b'], [1, 2]],
labels=[[0, 0, 1, 1], [0, 1, 0, 1]])
甚至可通過(guò)單索引的笛卡爾積來(lái)創(chuàng)建:
pd.MultiIndex.from_product([['a', 'b'], [1, 2]])
MultiIndex(levels=[['a', 'b'], [1, 2]],
labels=[[0, 0, 1, 1], [0, 1, 0, 1]])
同樣的巷屿,可以直接通過(guò)傳遞內(nèi)部編碼levels(包含每級(jí)可用索引值的列表)和lables(指代這些標(biāo)簽的列表)來(lái)構(gòu)造多級(jí)索引:
pd.MultiIndex(levels=[['a', 'b'], [1, 2]],
labels=[[0, 0, 1, 1], [0, 1, 0, 1]])
MultiIndex(levels=[['a', 'b'], [1, 2]],
labels=[[0, 0, 1, 1], [0, 1, 0, 1]])
所有這些對(duì)象,在創(chuàng)建Series或DataFrame時(shí)墩虹,都可用作為index參數(shù)傳進(jìn)去嘱巾,或者傳遞給已經(jīng)存在了的Series或DataFrame對(duì)象的reindex方法。
多級(jí)索引層級(jí)名稱(chēng)
有時(shí)诫钓,給多級(jí)索引的層級(jí)命名時(shí)很有用的旬昭。命名可以通過(guò)names參數(shù)給MultiIndex構(gòu)造器來(lái)實(shí)現(xiàn),或者設(shè)置已有索引的names屬性:
pop.index.names = ['state', 'year']
pop
state year
California 2000 33871648
2010 37253956
New York 2000 18976457
2010 19378102
Texas 2000 20851820
2010 25145561
dtype: int64
隨著參與的數(shù)據(jù)集變多菌湃,給索引命名來(lái)記錄不同索引的意義是非常有用的问拘。
列的多級(jí)索引
在DataFrame中,行和列是完全對(duì)稱(chēng)的惧所,正如行有多級(jí)索引骤坐,列也可以有多級(jí)索引∠掠考慮如下模擬的醫(yī)療數(shù)據(jù):
# hierarchical indices and columns
index = pd.MultiIndex.from_product([[2013, 2014], [1, 2]],
names=['year', 'visit'])
columns = pd.MultiIndex.from_product([['Bob', 'Guido', 'Sue'], ['HR', 'Temp']],
names=['subject', 'type'])
# mock some data
data = np.round(np.random.randn(4, 6), 1)
data[:, ::2] *= 10
data += 37
# create the DataFrame
health_data = pd.DataFrame(data, index=index, columns=columns)
health_data
subject | Bob | Guido | Sue | |||
---|---|---|---|---|---|---|
type | HR | Temp | HR | Temp | HR | Temp |
year | visit | |||||
2013 1 | 31.0 | 38.7 | 32.0 | 36.7 | 35.0 | 37.2 |
2 | 44.0 | 37.7 | 50.0 | 35.0 | 29.0 | 36.7 |
2014 1 | 30.0 | 37.4 | 39.0 | 37.8 | 61.0 | 36.9 |
2 | 47.0 | 37.8 | 48.0 | 37.3 | 51.0 | 36.5 |
我們很容易的得到了行和列的多級(jí)索引纽绍。這基本上是四維數(shù)據(jù),訪問(wèn)對(duì)象势似,檢查類(lèi)型拌夏,年份和訪問(wèn)次數(shù)。有了這個(gè)履因,我們可以通過(guò)最上層人的名稱(chēng)來(lái)檢索障簿,并且能夠得到只包含那個(gè)人信息的完整DataFrame:
health_data['Guido']
type | HR | Temp |
---|---|---|
year | visit | |
2013 1 | 32.0 | 36.7 |
2 | 50.0 | 35.0 |
2014 1 | 39.0 | 37.8 |
2 | 48.0 | 37.3 |
對(duì)于包含多個(gè)標(biāo)簽涵蓋多次,多個(gè)主題(人口栅迄,國(guó)家站故,城市等)的復(fù)雜數(shù)據(jù)記錄,使用層級(jí)化的行和列索引將會(huì)極其方便霞篡!
多索引的檢索和切片
多索引上面的檢索和切片被設(shè)計(jì)的很直觀世蔗,把索引當(dāng)作是增加的維度將會(huì)很有幫助端逼。
我們首先來(lái)看Series上的多索引檢索朗兵,然后再看DataFrame上的污淋。
多索引Series
考慮我們之前看到的州人口的多索引Series:
pop
state year
California 2000 33871648
2010 37253956
New York 2000 18976457
2010 19378102
Texas 2000 20851820
2010 25145561
dtype: int64
借助于多條目索引,我們可以訪問(wèn)單個(gè)數(shù)據(jù)元素:
pop['California', 2000]
33871648
MultiIndex也支持部分索引余掖,或者只是檢索索引層級(jí)中的一個(gè)寸爆。結(jié)果是另一個(gè)Series,保留著較低層的索引盐欺。
pop['California']
year
2000 33871648
2010 37253956
dtype: int64
部分切片也是可用的赁豆,只要多級(jí)索引是排過(guò)序的(參見(jiàn) Sorted and Unsorted Indices):
pop.loc['California':'New York']
state year
California 2000 33871648
2010 37253956
New York 2000 18976457
2010 19378102
dtype: int64
對(duì)于排過(guò)序的索引,將前級(jí)索引置為空冗美,基于低層級(jí)索引的檢索操作也可以執(zhí)行:
pop[:, 2000]
state
California 33871648
New York 18976457
Texas 20851820
dtype: int64
其他類(lèi)型的檢索和篩選操作(見(jiàn) Data Indexing and Selection) 工作的也很好魔种;例如,基于布爾過(guò)濾篩選:
pop[pop > 22000000]
state year
California 2000 33871648
2010 37253956
Texas 2010 25145561
dtype: int64
基于花式索引的篩選也可以工作:
pop[['California', 'Texas']]
state year
California 2000 33871648
2010 37253956
Texas 2000 20851820
2010 25145561
dtype: int64
DataFrames 的多層索引
DataFrame的多層索引的行為與Series類(lèi)似粉洼〗谠ぃ考慮前面用到的醫(yī)療數(shù)據(jù)DataFrame:
health_data
subject Bob Guido Sue
type HR Temp HR Temp HR Temp
year visit
2013 1 31.0 38.7 32.0 36.7 35.0 37.2
2 44.0 37.7 50.0 35.0 29.0 36.7
2014 1 30.0 37.4 39.0 37.8 61.0 36.9
2 47.0 37.8 48.0 37.3 51.0 36.5
要記住列在DataFrame中是主要元素,用于Series的多級(jí)索引語(yǔ)法也適用于列属韧。例如我們可以使用簡(jiǎn)單的方式獲得Guido的心率:
health_data['Guido', 'HR']
year visit
2013 1 32.0
2 50.0
2014 1 39.0
2 48.0
Name: (Guido, HR), dtype: float64
同樣安拟,與單一索引情況一樣,我們可以使用loc宵喂,iloc和ix 見(jiàn) Data Indexing and Selection糠赦。例如:
health_data.iloc[:2, :2]
subject Bob
type HR Temp
year visit
2013 1 31.0 38.7
2 44.0 37.7
這些檢索器在二維數(shù)據(jù)上需要提供數(shù)組類(lèi)似輸入,但可以把多索引元組傳遞給loc和iloc锅棕。例如:
health_data.loc[:, ('Bob', 'HR')]
year visit
2013 1 31.0
2 44.0
2014 1 30.0
2 47.0
Name: (Bob, HR), dtype: float64
在索引元組中使用切片不是特別方便拙泽;嘗試在元組中使用切片將會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤:
health_data.loc[(:, 1), (:, 'HR')]
File "<ipython-input-32-8e3cc151e316>", line 1
health_data.loc[(:, 1), (:, 'HR')]
^
SyntaxError: invalid syntax
可以通過(guò)顯示使用Python內(nèi)置的slice()函數(shù)構(gòu)建期望的切片來(lái)繞過(guò)上面的限制。但更好的辦法是使用IndexSlice對(duì)象裸燎,它是Pandas專(zhuān)門(mén)用來(lái)處理這種情形的奔滑。例如:
idx = pd.IndexSlice
health_data.loc[idx[:, 1], idx[:, 'HR']]
subject Bob Guido Sue
type HR HR HR
year visit
2013 1 31.0 32.0 35.0
2014 1 30.0 39.0 61.0
有許多方法可以同多索引Series和DataFrame進(jìn)行交互,如同本書(shū)中的許多工具一樣顺少,最好的熟悉方法是多嘗試朋其!
多索引重排
使用多索引數(shù)據(jù)的一個(gè)關(guān)鍵是知道如何有效的轉(zhuǎn)換數(shù)據(jù)。有許多操作會(huì)保留數(shù)據(jù)集的所有信息脆炎,但為了不同的目的而對(duì)它進(jìn)行重拍梅猿。我們看過(guò)簡(jiǎn)短的例子:stack()和unstack()方法;但是有更多方法可以精細(xì)的控制數(shù)據(jù)在層級(jí)索引和列直接進(jìn)行轉(zhuǎn)換,讓我們來(lái)探索它們:
排序索引和未排序索引
之前我們?cè)?jīng)有警告秒裕,但在這里應(yīng)該強(qiáng)調(diào)一下.如果索引是未排序的話(huà)袱蚓,許多多索引切片操作將會(huì)失敗。
我們由創(chuàng)建一些簡(jiǎn)單的未排序多索引數(shù)據(jù)開(kāi)始:
index = pd.MultiIndex.from_product([['a', 'c', 'b'], [1, 2]])
data = pd.Series(np.random.rand(6), index=index)
data.index.names = ['char', 'int']
data
char int
a 1 0.003001
2 0.164974
c 1 0.741650
2 0.569264
b 1 0.001693
2 0.526226
dtype: float64
如果對(duì)這個(gè)索引進(jìn)行部分切片的話(huà)几蜻,它將導(dǎo)致一個(gè)錯(cuò)誤:
try:
data['a':'b']
except KeyError as e:
print(type(e))
print(e)
<class 'KeyError'>
'Key length (1) was greater than MultiIndex lexsort depth (0)'
盡管錯(cuò)誤信息不是特別清楚喇潘,原因是多級(jí)索引沒(méi)有排序体斩。因?yàn)楦鞣N原因,部分切片和其它類(lèi)似操作要求多級(jí)索引的各個(gè)層級(jí)是排序了的颖低。Pandas提供了幾種方法的函數(shù)來(lái)執(zhí)行這類(lèi)排序絮吵;例如DataFrame的sort_index()和sortlevel()方法。這兒我們使用最簡(jiǎn)單的sort_index():
data = data.sort_index()
data
char int
a 1 0.003001
2 0.164974
b 1 0.001693
2 0.526226
c 1 0.741650
2 0.569264
dtype: float64
索引經(jīng)過(guò)這樣的排序忱屑,部分切片就會(huì)按期望的工作了:
data['a':'b']
char int
a 1 0.003001
2 0.164974
b 1 0.001693
2 0.526226
dtype: float64
索引的聚集和打散
我們前面簡(jiǎn)要的見(jiàn)過(guò)蹬敲,可以將聚集的多索引轉(zhuǎn)換未簡(jiǎn)單的二維表現(xiàn),所使用的層級(jí)是可以選的:
pop.unstack(level=0)
state California New York Texas
year
2000 33871648 18976457 20851820
2010 37253956 19378102 25145561
pop.unstack(level=1)
year 2000 2010
state
California 33871648 37253956
New York 18976457 19378102
Texas 20851820 25145561
unstack()的反向操作是stack()莺戒,它可以用來(lái)恢復(fù)原始的Series:
pop.unstack().stack()
state year
California 2000 33871648
2010 37253956
New York 2000 18976457
2010 19378102
Texas 2000 20851820
2010 25145561
dtype: int64
索引設(shè)置和重置
另一種重排層級(jí)化數(shù)據(jù)的方法是將索引標(biāo)簽變成列伴嗡;這可以通過(guò)reset_index方法實(shí)現(xiàn)。在人口字典上調(diào)用這個(gè)方法會(huì)導(dǎo)致原來(lái)index里面的state和year信息變成DataFrame對(duì)應(yīng)的列从铲。為清晰起見(jiàn)瘪校,我們可以指定數(shù)據(jù)列顯示的名稱(chēng):
pop_flat = pop.reset_index(name='population')
pop_flat
state year population
0 California 2000 33871648
1 California 2010 37253956
2 New York 2000 18976457
3 New York 2010 19378102
4 Texas 2000 20851820
5 Texas 2010 25145561
通常在現(xiàn)實(shí)世界中,原始的輸入數(shù)據(jù)就是這個(gè)樣子的名段。通過(guò)列名稱(chēng)來(lái)構(gòu)建多索引非常有用阱扬。可以同DataFrame的set_index方法來(lái)實(shí)現(xiàn)吉嫩,結(jié)果返回的就是多級(jí)索引DataFrame:
pop_flat.set_index(['state', 'year'])
population
state year
California 2000 33871648
2010 37253956
New York 2000 18976457
2010 19378102
Texas 2000 20851820
2010 25145561
在實(shí)踐中价认,我發(fā)現(xiàn)這類(lèi)重置索引的方法是處理真實(shí)數(shù)據(jù)集最有用的模式之一。
多索引上的數(shù)據(jù)聚合
我們之前看到過(guò)Pandas的內(nèi)部數(shù)據(jù)聚合方法自娩,例如mean(),sum()和max()用踩。對(duì)于層級(jí)索引數(shù)據(jù),可以傳遞一個(gè)level參數(shù)來(lái)控制對(duì)那個(gè)數(shù)據(jù)子集進(jìn)行計(jì)算忙迁。例如脐彩,我們回到健康數(shù)據(jù):
health_data
subject Bob Guido Sue
type HR Temp HR Temp HR Temp
year visit
2013 1 31.0 38.7 32.0 36.7 35.0 37.2
2 44.0 37.7 50.0 35.0 29.0 36.7
2014 1 30.0 37.4 39.0 37.8 61.0 36.9
2 47.0 37.8 48.0 37.3 51.0 36.5
也許我們想平均一下每年兩次來(lái)訪的測(cè)量值。我們可以通過(guò)指定想要的索引層級(jí)名稱(chēng)來(lái)實(shí)現(xiàn)姊扔,本例使用的是year:
data_mean = health_data.mean(level='year')
data_mean
subject Bob Guido Sue
type HR Temp HR Temp HR Temp
year
2013 37.5 38.2 41.0 35.85 32.0 36.95
2014 38.5 37.6 43.5 37.55 56.0 36.70
借助于使用關(guān)鍵字axis惠奸,我們也可以獲取列中某層級(jí)的均值:
data_mean.mean(axis=1, level='type')
type HR Temp
year
2013 36.833333 37.000000
2014 46.000000 37.283333
只用了兩行,我們就能夠發(fā)現(xiàn)訪問(wèn)對(duì)象的每年平均心率和體溫測(cè)量值恰梢。這個(gè)語(yǔ)法實(shí)際是Groupby功能的快捷方法佛南,見(jiàn)Aggregation and Grouping
雖然這只是一個(gè)小例子,許多真實(shí)的數(shù)據(jù)集由相似的層級(jí)結(jié)構(gòu)嵌言。
旁白:面板數(shù)據(jù)
Pandas還有幾種我們沒(méi)有講到的數(shù)據(jù)類(lèi)型嗅回,即pd.Panel和pd.Panel4D對(duì)象。它們分別可以被看做是泛化的3維和4維結(jié)構(gòu)摧茴,就像Serie是一維绵载,DataFrame是二維一樣。一旦熟悉了Series和DataFrame的索引和數(shù)據(jù)操作,對(duì)Panel和Panel4D基本可以直接使用娃豹。特別是索引器ix焚虱,loc和iloc,它們完全適用于這些高維數(shù)據(jù)結(jié)構(gòu)懂版。
我們不會(huì)再覆蓋這些面板結(jié)構(gòu)鹃栽,因?yàn)槲野l(fā)現(xiàn)在大多數(shù)情況下,多級(jí)索引是非常有用的定续,并且可以在概念上非常簡(jiǎn)潔的表示高維數(shù)據(jù)谍咆。另外面板數(shù)據(jù)是密數(shù)據(jù)表達(dá)禾锤,而多級(jí)索引基本上是稀數(shù)據(jù)表達(dá)私股。隨著維度的增加,密表達(dá)方式對(duì)于真實(shí)數(shù)據(jù)集來(lái)說(shuō)變得效率很低恩掷。但對(duì)于一些特殊的應(yīng)用倡鲸,這些結(jié)構(gòu)也很有用。如果想要知道更多關(guān)于Panel和Panel4D結(jié)構(gòu)黄娘,請(qǐng)看列在Further Resources.中的參考文獻(xiàn)峭状。