Pandas的MultiIndex多層索引使用說明
MultiIndex多層索引
MultiIndex,即具有多個層次的索引,有些類似于根據(jù)索引進行分組的形式。通過多層次索引,我們就可以使用高層次的索引,來操作整個索引組的數(shù)據(jù)。通過給索引分類分組,則可以操作組數(shù)據(jù)。
1.創(chuàng)建方式
1.1.第一種:多維數(shù)組
我們在創(chuàng)建Series或DataFrame時,可以通過給index(columns)參數(shù)傳遞多維數(shù)組,進而構(gòu)建多維索引。
【數(shù)組中每個維度對應(yīng)位置的元素,組成每個索引值】
多維索引也可以設(shè)置名稱(name性),屬性的值為一維數(shù)組,元素的個數(shù)需要與索引的層數(shù)相同(每層索引都需要具有一個名稱)。
1.2.第二種:MultiIndex
我們可以通過MultiIndex類的相關(guān)方法,預(yù)先創(chuàng)建一個MultiIndex對象,然后作為Series與DataFrame中的index(或columns)參數(shù)值。同時,可以通過names參數(shù)指定多層索引的名稱。
from_arrays
:接收一個多維數(shù)組參數(shù),高維指定高層索引,低維指定底層索引。from_tuples
:接收一個元組的列表,每個元組指定每個索引(高維索引,低維索引)。from_product
:接收一個可迭代對象的列表,根據(jù)多個可迭代對象元素的笛卡爾積進行創(chuàng)建索引。
from_product相對于前兩個方法而言,實現(xiàn)相對簡單,但是,也存在局限。
1.3.創(chuàng)建案例:
import numpy as np import pandas as pd import warnings warnings.filterwarnings('ignore')
#通過給index(columns)參數(shù)傳遞多維數(shù)組,進而構(gòu)建多維索引 # 多層索引,指定一個多維數(shù)組。多維數(shù)組中,逐級給出每層索引的值。 s = pd.Series([1, 2, 3, 4], index=[["A", "A", "B", "B"], ["a", "b", "c", "d"]]) # 多于多層索引,每一層都具有一個名字。 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"])
#通過MultiIndex類的方法進行創(chuàng)建。 # 通過列表的方式進行創(chuàng)建。(每個內(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) # 通過元組構(gòu)成列表的方式進行創(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) # 通過乘積(笛卡爾積)的方式進行創(chuàng)建。 product1 = pd.MultiIndex.from_product([["A", "B"], ["a", "b"]]) df3 = pd.DataFrame(np.random.random((4, 3)), index=product1) display(df3)
2.多層索引操作
對于多層索引,同樣也支持單層索引的相關(guān)操作,例如,索引元素,切片,索引數(shù)組選擇元素等。我們也可以根據(jù)多級索引,按層次逐級選擇元素。
多層索引的優(yōu)勢:通過創(chuàng)建多層索引,我們就可以使用高層次的索引,來操作整個索引組的數(shù)據(jù)。格式:
- s[操作]
- s.loc[操作]
- s.iloc[操作]
其中,操作可以是索引,切片,數(shù)組索引,布爾索引。
2.1.Series多層索引
- 通過loc(標簽索引)操作,可以通過多層索引,獲取該索引所對應(yīng)的一組值。
- 通過iloc(位置索引)操作,會獲取對應(yīng)位置的元素值(與是否多層索引無關(guān))。
- 通過s[操作]的行為有些詭異,建議不用。
- 對于索引(單級),首先按照標簽選擇,如果標簽不存在,則按照位置選擇。
- 對于多級索引,則按照標簽進行選擇。
- 對于切片,如果提供的是整數(shù),則按照位置選擇,否則按照標簽選擇。
- 對于數(shù)組索引, 如果數(shù)組元素都是整數(shù),則根據(jù)位置進行索引,否則,根據(jù)標簽進行索引。
2.2.DataFrame多層索引
- 通過loc(標簽索引)操作,可以通過多層索引,獲取該索引所對應(yīng)的一組值。
- 通過iloc(位置索引)操作,會獲取對應(yīng)位置的一行(與是否多層索引無關(guān))。
- 通過s[操作]的行為有些詭異,建議不用。
- 對于索引,根據(jù)標簽獲取相應(yīng)的列(如果是多層索引,則可以獲得多列)。
- 對于數(shù)組索引, 根據(jù)標簽,獲取相應(yīng)的列(如果是多層索引,則可以獲得多列)。
- 對于切片,首先按照標簽進行索引,然后再按照位置進行索引(取行)。
2.3.交換索引
df.swaplevel(i=-2, j=-1, axis=0)
我們可以調(diào)用DataFrame對象的swaplevel方法來交換兩個層級索引。該方法默認對倒數(shù)第2層與倒數(shù)第1層進行交換。我們也可以指定交換的層。層次從0開始,由外向內(nèi)遞增(或者由上到下遞增),也可以指定負值,負值表示倒數(shù)第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) # 多層索引,編號從外向內(nèi),0, 1, 2, 3.同時,索引編號也支持負值。 # 負值表示從內(nèi)向外,-1, -2, -3. -1表示最內(nèi)層。 display(df.swaplevel()) #默認對倒數(shù)第2層與倒數(shù)第1層進行交換 display(df.swaplevel(0, 2)) # 交換多層索引時,我們除了可以指定層次的編號外,也可以指定索引層次的名稱。 display(df.swaplevel("layer1", "layer3"))
2.4.索引排序
我們可以使用sort_index方法對索引進行排序處理。
Signature: df.sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, by=None)
level
:指定根據(jù)哪一層進行排序,默認為最外(上)層。該值可以是數(shù)值,索引名,或者是由二者構(gòu)成的列表。inplace
:是否就地修改。默認為False。
display(df.sort_index()) #默認索引排序 # 自定義排序的層次。 display(df.sort_index(level=1)) display(df.sort_index(level=2)) # 也可以通過索引的名稱進行排序。 display(df.sort_index(level="layer1")) display(df.sort_index(level="layer2"))
2.5.索引堆疊
通過DataFrame對象的stack方法,可以進行索引堆疊,即將指定層級的列轉(zhuǎn)換成行。
level
:指定轉(zhuǎn)換的層級,默認為-1。
# 進行堆疊 列->行 取消堆疊 行->列 df.stack() df.unstack()
2.6.取消堆疊
通過DataFrame對象的unstack方法,可以取消索引堆疊,即將指定層級的行轉(zhuǎn)換成列。 level:指定轉(zhuǎn)換的層級,默認為-1。 fill_value:指定填充值。默認為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默認會將最內(nèi)層取消堆疊,我們也可以自行來指定層次。 display(df.unstack(0))
# 進行堆疊 列->行 取消堆疊 行->列 df.stack() # df.unstack() # stack堆疊也可以指定層次。 # stack堆疊也可以通過索引名進行操作。 df.stack(0)
2.7.設(shè)置索引
在DataFrame中,如果我們需要將現(xiàn)有的某一(幾)列作為索引列,可以調(diào)用set_index方法來實現(xiàn)。
Signature
: df.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)drop
:是否丟棄作為新索引的列,默認為True。append
:是否以追加的方式設(shè)置索引,默認為False。inplace
:是否就地修改,默認為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對象的reset_index,可以重置索引。該操作與set_index正好相反。
Signature
: df.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')level
:重置索引的層級,默認重置所有層級的索引。如果重置所有索引,將會創(chuàng)建默認整數(shù)序列索引。drop
:是否丟棄重置的索引列,默認為False。inplace
:是否就地修改,默認為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)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python 解決pycharm運行py文件只有unittest選項的問題
這篇文章主要介紹了python 解決pycharm運行py文件只有unittest選項的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09提升Python Scrapy庫數(shù)據(jù)采集速度實現(xiàn)高效爬蟲
Scrapy是一個強大而靈活的Python爬蟲框架,被廣泛用于數(shù)據(jù)采集、網(wǎng)站抓取和網(wǎng)絡(luò)爬蟲開發(fā),本文將深入介紹Scrapy的功能和用法,并提供豐富的示例代碼,幫助更好地理解和應(yīng)用2023-11-11Python使用Matplotlib實現(xiàn)雨點圖動畫效果的方法
這篇文章主要介紹了Python使用Matplotlib實現(xiàn)雨點圖動畫效果的方法,結(jié)合實例形式分析了win10安裝ffmpeg及animation函數(shù)的使用相關(guān)操作技巧,需要的朋友可以參考下2017-12-12Python報錯KeyError: ‘missing_key‘的有效解決方法
在 Python 編程中,報錯信息常常讓開發(fā)者感到困擾,其中,“KeyError: ‘missing_key’”是一個較為常見的報錯,它可能在各種數(shù)據(jù)處理和字典操作的場景中出現(xiàn),本文將深入探討這個報錯的原因,并提供多種有效的解決方法,幫助開發(fā)者快速解決此類問題2024-10-10