Pandas的MultiIndex多層索引使用說(shuō)明
MultiIndex多層索引
MultiIndex,即具有多個(gè)層次的索引,有些類似于根據(jù)索引進(jìn)行分組的形式。通過(guò)多層次索引,我們就可以使用高層次的索引,來(lái)操作整個(gè)索引組的數(shù)據(jù)。通過(guò)給索引分類分組,則可以操作組數(shù)據(jù)。
1.創(chuàng)建方式
1.1.第一種:多維數(shù)組
我們?cè)趧?chuàng)建Series或DataFrame時(shí),可以通過(guò)給index(columns)參數(shù)傳遞多維數(shù)組,進(jìn)而構(gòu)建多維索引。
【數(shù)組中每個(gè)維度對(duì)應(yīng)位置的元素,組成每個(gè)索引值】
多維索引也可以設(shè)置名稱(name性),屬性的值為一維數(shù)組,元素的個(gè)數(shù)需要與索引的層數(shù)相同(每層索引都需要具有一個(gè)名稱)。
1.2.第二種:MultiIndex
我們可以通過(guò)MultiIndex類的相關(guān)方法,預(yù)先創(chuàng)建一個(gè)MultiIndex對(duì)象,然后作為Series與DataFrame中的index(或columns)參數(shù)值。同時(shí),可以通過(guò)names參數(shù)指定多層索引的名稱。
from_arrays:接收一個(gè)多維數(shù)組參數(shù),高維指定高層索引,低維指定底層索引。from_tuples:接收一個(gè)元組的列表,每個(gè)元組指定每個(gè)索引(高維索引,低維索引)。from_product:接收一個(gè)可迭代對(duì)象的列表,根據(jù)多個(gè)可迭代對(duì)象元素的笛卡爾積進(jìn)行創(chuàng)建索引。
from_product相對(duì)于前兩個(gè)方法而言,實(shí)現(xiàn)相對(duì)簡(jiǎn)單,但是,也存在局限。
1.3.創(chuàng)建案例:
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
#通過(guò)給index(columns)參數(shù)傳遞多維數(shù)組,進(jìn)而構(gòu)建多維索引 # 多層索引,指定一個(gè)多維數(shù)組。多維數(shù)組中,逐級(jí)給出每層索引的值。 s = pd.Series([1, 2, 3, 4], index=[["A", "A", "B", "B"], ["a", "b", "c", "d"]]) # 多于多層索引,每一層都具有一個(gè)名字。 s.index.names = ["index1", "index2"] display(s) display(s.loc["A"].loc["a"])

df=pd.DataFrame(np.arange(9).reshape(3, 3), columns=[["X", "X", "Y"], ["x1", 'x2', 'y1']],index=[["A", "B", "B"], ["a", 'a', 'b']]) display(df) display(df.loc["B"]) display(df["X"]) display(df.loc["B"].loc["a"]["X"]["x1"])

#通過(guò)MultiIndex類的方法進(jìn)行創(chuàng)建。
# 通過(guò)列表的方式進(jìn)行創(chuàng)建。(每個(gè)內(nèi)嵌列表元素指定層次的索引,[[第0層索引], [第1層索引],……[第n層索引]])
array1=pd.MultiIndex.from_arrays([["A","A","B"],["a","b","a"]])
df=pd.DataFrame(np.random.rand(3,3),index=array1)
display(df)
# 通過(guò)元組構(gòu)成列表的方式進(jìn)行創(chuàng)建。[(高層,底層), (高層, 底層), ……]
tuple1 = pd.MultiIndex.from_tuples([("A", "a"), ("A", "b"), ("B", "a")])
df2 = pd.DataFrame(np.random.random((3, 3)), index=tuple1)
display(df2)
# 通過(guò)乘積(笛卡爾積)的方式進(jìn)行創(chuàng)建。
product1 = pd.MultiIndex.from_product([["A", "B"], ["a", "b"]])
df3 = pd.DataFrame(np.random.random((4, 3)), index=product1)
display(df3)


2.多層索引操作
對(duì)于多層索引,同樣也支持單層索引的相關(guān)操作,例如,索引元素,切片,索引數(shù)組選擇元素等。我們也可以根據(jù)多級(jí)索引,按層次逐級(jí)選擇元素。
多層索引的優(yōu)勢(shì):通過(guò)創(chuàng)建多層索引,我們就可以使用高層次的索引,來(lái)操作整個(gè)索引組的數(shù)據(jù)。格式:
- s[操作]
- s.loc[操作]
- s.iloc[操作]
其中,操作可以是索引,切片,數(shù)組索引,布爾索引。
2.1.Series多層索引
- 通過(guò)loc(標(biāo)簽索引)操作,可以通過(guò)多層索引,獲取該索引所對(duì)應(yīng)的一組值。
- 通過(guò)iloc(位置索引)操作,會(huì)獲取對(duì)應(yīng)位置的元素值(與是否多層索引無(wú)關(guān))。
- 通過(guò)s[操作]的行為有些詭異,建議不用。
- 對(duì)于索引(單級(jí)),首先按照標(biāo)簽選擇,如果標(biāo)簽不存在,則按照位置選擇。
- 對(duì)于多級(jí)索引,則按照標(biāo)簽進(jìn)行選擇。
- 對(duì)于切片,如果提供的是整數(shù),則按照位置選擇,否則按照標(biāo)簽選擇。
- 對(duì)于數(shù)組索引, 如果數(shù)組元素都是整數(shù),則根據(jù)位置進(jìn)行索引,否則,根據(jù)標(biāo)簽進(jìn)行索引。
2.2.DataFrame多層索引
- 通過(guò)loc(標(biāo)簽索引)操作,可以通過(guò)多層索引,獲取該索引所對(duì)應(yīng)的一組值。
- 通過(guò)iloc(位置索引)操作,會(huì)獲取對(duì)應(yīng)位置的一行(與是否多層索引無(wú)關(guān))。
- 通過(guò)s[操作]的行為有些詭異,建議不用。
- 對(duì)于索引,根據(jù)標(biāo)簽獲取相應(yīng)的列(如果是多層索引,則可以獲得多列)。
- 對(duì)于數(shù)組索引, 根據(jù)標(biāo)簽,獲取相應(yīng)的列(如果是多層索引,則可以獲得多列)。
- 對(duì)于切片,首先按照標(biāo)簽進(jìn)行索引,然后再按照位置進(jìn)行索引(取行)。
2.3.交換索引
df.swaplevel(i=-2, j=-1, axis=0)
我們可以調(diào)用DataFrame對(duì)象的swaplevel方法來(lái)交換兩個(gè)層級(jí)索引。該方法默認(rèn)對(duì)倒數(shù)第2層與倒數(shù)第1層進(jìn)行交換。我們也可以指定交換的層。層次從0開始,由外向內(nèi)遞增(或者由上到下遞增),也可以指定負(fù)值,負(fù)值表示倒數(shù)第n層。除此之外,我們也可以使用層次索引的名稱來(lái)進(jìn)行交換。
df = pd.DataFrame(np.random.rand(4, 4), index=[["A", "A", "B", "B"], ["a1", "a1", "b1", "c1"], ["a2", "b2", "c2", "c2"]])
df.index.names = ["layer1", "layer2", "layer3"]
display(df)
# 多層索引,編號(hào)從外向內(nèi),0, 1, 2, 3.同時(shí),索引編號(hào)也支持負(fù)值。
# 負(fù)值表示從內(nèi)向外,-1, -2, -3. -1表示最內(nèi)層。
display(df.swaplevel()) #默認(rèn)對(duì)倒數(shù)第2層與倒數(shù)第1層進(jìn)行交換
display(df.swaplevel(0, 2))
# 交換多層索引時(shí),我們除了可以指定層次的編號(hào)外,也可以指定索引層次的名稱。
display(df.swaplevel("layer1", "layer3"))




2.4.索引排序
我們可以使用sort_index方法對(duì)索引進(jìn)行排序處理。
Signature: df.sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, by=None)
level:指定根據(jù)哪一層進(jìn)行排序,默認(rèn)為最外(上)層。該值可以是數(shù)值,索引名,或者是由二者構(gòu)成的列表。inplace:是否就地修改。默認(rèn)為False。
display(df.sort_index()) #默認(rèn)索引排序 # 自定義排序的層次。 display(df.sort_index(level=1)) display(df.sort_index(level=2)) # 也可以通過(guò)索引的名稱進(jìn)行排序。 display(df.sort_index(level="layer1")) display(df.sort_index(level="layer2"))
2.5.索引堆疊
通過(guò)DataFrame對(duì)象的stack方法,可以進(jìn)行索引堆疊,即將指定層級(jí)的列轉(zhuǎn)換成行。
level:指定轉(zhuǎn)換的層級(jí),默認(rèn)為-1。
# 進(jìn)行堆疊 列->行 取消堆疊 行->列 df.stack() df.unstack()
2.6.取消堆疊
通過(guò)DataFrame對(duì)象的unstack方法,可以取消索引堆疊,即將指定層級(jí)的行轉(zhuǎn)換成列。 level:指定轉(zhuǎn)換的層級(jí),默認(rèn)為-1。 fill_value:指定填充值。默認(rèn)為NaN。
df = pd.DataFrame(np.random.rand(4, 4), index=[["A", "B", "B", "A"], ["b", "b", "a", "c"], ["b2", "c2", "a2", "c2"]]) df.index.names = ["layer1", "layer2", "layer3"] display(df)

# 取消堆疊,如果沒有匹配的數(shù)據(jù),則顯示空值NaN。 display(df.unstack())

# 我們可以指定值去填充NaN(空值)。 df.unstack(fill_value=11)

# unstack默認(rèn)會(huì)將最內(nèi)層取消堆疊,我們也可以自行來(lái)指定層次。 display(df.unstack(0))

# 進(jìn)行堆疊 列->行 取消堆疊 行->列 df.stack() # df.unstack() # stack堆疊也可以指定層次。 # stack堆疊也可以通過(guò)索引名進(jìn)行操作。 df.stack(0)

2.7.設(shè)置索引
在DataFrame中,如果我們需要將現(xiàn)有的某一(幾)列作為索引列,可以調(diào)用set_index方法來(lái)實(shí)現(xiàn)。
Signature: df.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)drop:是否丟棄作為新索引的列,默認(rèn)為True。append:是否以追加的方式設(shè)置索引,默認(rèn)為False。inplace:是否就地修改,默認(rèn)為False。
df = pd.DataFrame({"pk":[1, 2, 3, 4], "age":[15, 20, 17, 8], "name":["n1", "n2", "n3", "n4"]})
display(df)
df1 = df.set_index("pk", drop=False)
display(df1)

2.8.重置索引
調(diào)用在DataFrame對(duì)象的reset_index,可以重置索引。該操作與set_index正好相反。
Signature: df.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')level:重置索引的層級(jí),默認(rèn)重置所有層級(jí)的索引。如果重置所有索引,將會(huì)創(chuàng)建默認(rèn)整數(shù)序列索引。drop:是否丟棄重置的索引列,默認(rèn)為False。inplace:是否就地修改,默認(rèn)為False。
df = pd.DataFrame({"pk":[1, 2, 3, 4], "age":[15, 20, 17, 8], "name":["n1", "n2", "n3", "n4"]})
#display(df)
df1 = df.set_index("pk", drop=False)
#display(df1)
df2 = df1.reset_index(0, drop=True)
display(df2)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python 解決pycharm運(yùn)行py文件只有unittest選項(xiàng)的問(wèn)題
這篇文章主要介紹了python 解決pycharm運(yùn)行py文件只有unittest選項(xiàng)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
python爬取淘寶商品詳情頁(yè)數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了python爬取淘寶商品詳情頁(yè)數(shù)據(jù)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
Python使用scrapy爬取陽(yáng)光熱線問(wèn)政平臺(tái)過(guò)程解析
這篇文章主要介紹了Python使用scrapy爬取陽(yáng)光熱線問(wèn)政平臺(tái)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Python實(shí)現(xiàn)定時(shí)任務(wù)
本篇文章主要介紹了Python實(shí)現(xiàn)定時(shí)任務(wù),主要有5種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02
提升Python Scrapy庫(kù)數(shù)據(jù)采集速度實(shí)現(xiàn)高效爬蟲
Scrapy是一個(gè)強(qiáng)大而靈活的Python爬蟲框架,被廣泛用于數(shù)據(jù)采集、網(wǎng)站抓取和網(wǎng)絡(luò)爬蟲開發(fā),本文將深入介紹Scrapy的功能和用法,并提供豐富的示例代碼,幫助更好地理解和應(yīng)用2023-11-11
Python使用Matplotlib實(shí)現(xiàn)雨點(diǎn)圖動(dòng)畫效果的方法
這篇文章主要介紹了Python使用Matplotlib實(shí)現(xiàn)雨點(diǎn)圖動(dòng)畫效果的方法,結(jié)合實(shí)例形式分析了win10安裝ffmpeg及animation函數(shù)的使用相關(guān)操作技巧,需要的朋友可以參考下2017-12-12
Python報(bào)錯(cuò)KeyError: ‘missing_key‘的有效解決方法
在 Python 編程中,報(bào)錯(cuò)信息常常讓開發(fā)者感到困擾,其中,“KeyError: ‘missing_key’”是一個(gè)較為常見的報(bào)錯(cuò),它可能在各種數(shù)據(jù)處理和字典操作的場(chǎng)景中出現(xiàn),本文將深入探討這個(gè)報(bào)錯(cuò)的原因,并提供多種有效的解決方法,幫助開發(fā)者快速解決此類問(wèn)題2024-10-10

