5.層次化索引

到目前為止我們關(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)峭状。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市逼争,隨后出現(xiàn)的幾起案子优床,更是在濱河造成了極大的恐慌,老刑警劉巖誓焦,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胆敞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡杂伟,警方通過(guò)查閱死者的電腦和手機(jī)移层,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)赫粥,“玉大人观话,你說(shuō)我怎么就攤上這事≡狡剑” “怎么了频蛔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)秦叛。 經(jīng)常有香客問(wèn)我晦溪,道長(zhǎng),這世上最難降的妖魔是什么书闸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任尼变,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嫌术。我一直安慰自己哀澈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布度气。 她就那樣靜靜地躺著割按,像睡著了一般。 火紅的嫁衣襯著肌膚如雪磷籍。 梳的紋絲不亂的頭發(fā)上适荣,一...
    開(kāi)封第一講書(shū)人閱讀 49,842評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音院领,去河邊找鬼弛矛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛比然,可吹牛的內(nèi)容都是我干的丈氓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼强法,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼万俗!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起饮怯,我...
    開(kāi)封第一講書(shū)人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤闰歪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蓖墅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體库倘,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年置媳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了于樟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拇囊,死狀恐怖迂曲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寥袭,我是刑警寧澤路捧,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站传黄,受9級(jí)特大地震影響杰扫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜膘掰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一章姓、第九天 我趴在偏房一處隱蔽的房頂上張望佳遣。 院中可真熱鬧,春花似錦凡伊、人聲如沸零渐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)诵盼。三九已至,卻和暖如春银还,著一層夾襖步出監(jiān)牢的瞬間风宁,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工蛹疯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留戒财,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓苍苞,卻偏偏與公主長(zhǎng)得像固翰,于是被迫代替她去往敵國(guó)和親狼纬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子羹呵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容