中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Pandas的MultiIndex多層索引是怎樣使用的

發布時間:2021-09-24 15:51:31 來源:億速云 閱讀:371 作者:柒染 欄目:開發技術

Pandas的MultiIndex多層索引是怎樣使用的,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

MultiIndex多層索引

MultiIndex,即具有多個層次的索引,有些類似于根據索引進行分組的形式。通過多層次索引,我們就可以使用高層次的索引,來操作整個索引組的數據。通過給索引分類分組,則可以操作組數據。

1.創建方式

1.1.第一種:多維數組

我們在創建Series或DataFrame時,可以通過給index(columns)參數傳遞多維數組,進而構建多維索引。

【數組中每個維度對應位置的元素,組成每個索引值】

多維索引也可以設置名稱(name性),屬性的值為一維數組,元素的個數需要與索引的層數相同(每層索引都需要具有一個名稱)。

1.2.第二種:MultiIndex

我們可以通過MultiIndex類的相關方法,預先創建一個MultiIndex對象,然后作為Series與DataFrame中的index(或columns)參數值。同時,可以通過names參數指定多層索引的名稱。

  • from_arrays:接收一個多維數組參數,高維指定高層索引,低維指定底層索引。

  • from_tuples:接收一個元組的列表,每個元組指定每個索引(高維索引,低維索引)。

  • from_product:接收一個可迭代對象的列表,根據多個可迭代對象元素的笛卡爾積進行創建索引。

from_product相對于前兩個方法而言,實現相對簡單,但是,也存在局限。

1.3.創建案例:

import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
#通過給index(columns)參數傳遞多維數組,進而構建多維索引
# 多層索引,指定一個多維數組。多維數組中,逐級給出每層索引的值。
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"])

Pandas的MultiIndex多層索引是怎樣使用的

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"])

Pandas的MultiIndex多層索引是怎樣使用的

#通過MultiIndex類的方法進行創建。
# 通過列表的方式進行創建。(每個內嵌列表元素指定層次的索引,[[第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)
# 通過元組構成列表的方式進行創建。[(高層,底層), (高層, 底層), ……]
tuple1 = pd.MultiIndex.from_tuples([("A", "a"), ("A", "b"), ("B", "a")])
df2 = pd.DataFrame(np.random.random((3, 3)), index=tuple1)
display(df2)
# 通過乘積(笛卡爾積)的方式進行創建。
product1 = pd.MultiIndex.from_product([["A", "B"], ["a", "b"]])
df3 = pd.DataFrame(np.random.random((4, 3)), index=product1)
display(df3)

Pandas的MultiIndex多層索引是怎樣使用的Pandas的MultiIndex多層索引是怎樣使用的

2.多層索引操作

對于多層索引,同樣也支持單層索引的相關操作,例如,索引元素,切片,索引數組選擇元素等。我們也可以根據多級索引,按層次逐級選擇元素。

多層索引的優勢:通過創建多層索引,我們就可以使用高層次的索引,來操作整個索引組的數據。格式:

  • s[操作]

  • s.loc[操作]

  • s.iloc[操作]

其中,操作可以是索引,切片,數組索引,布爾索引。

2.1.Series多層索引
  • 通過loc(標簽索引)操作,可以通過多層索引,獲取該索引所對應的一組值。

  • 通過iloc(位置索引)操作,會獲取對應位置的元素值(與是否多層索引無關)。

  • 通過s[操作]的行為有些詭異,建議不用。

    • 對于索引(單級),首先按照標簽選擇,如果標簽不存在,則按照位置選擇。

    • 對于多級索引,則按照標簽進行選擇。

    • 對于切片,如果提供的是整數,則按照位置選擇,否則按照標簽選擇。

    • 對于數組索引, 如果數組元素都是整數,則根據位置進行索引,否則,根據標簽進行索引。

2.2.DataFrame多層索引
  • 通過loc(標簽索引)操作,可以通過多層索引,獲取該索引所對應的一組值。

  • 通過iloc(位置索引)操作,會獲取對應位置的一行(與是否多層索引無關)。

  • 通過s[操作]的行為有些詭異,建議不用。

    • 對于索引,根據標簽獲取相應的列(如果是多層索引,則可以獲得多列)。

    • 對于數組索引, 根據標簽,獲取相應的列(如果是多層索引,則可以獲得多列)。

    • 對于切片,首先按照標簽進行索引,然后再按照位置進行索引(取行)。

2.3.交換索引
df.swaplevel(i=-2, j=-1, axis=0)

我們可以調用DataFrame對象的swaplevel方法來交換兩個層級索引。該方法默認對倒數第2層與倒數第1層進行交換。我們也可以指定交換的層。層次從0開始,由外向內遞增(或者由上到下遞增),也可以指定負值,負值表示倒數第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)
# 多層索引,編號從外向內,0, 1, 2, 3.同時,索引編號也支持負值。
# 負值表示從內向外,-1, -2, -3. -1表示最內層。
display(df.swaplevel())  #默認對倒數第2層與倒數第1層進行交換
display(df.swaplevel(0, 2))
# 交換多層索引時,我們除了可以指定層次的編號外,也可以指定索引層次的名稱。
display(df.swaplevel("layer1", "layer3"))

Pandas的MultiIndex多層索引是怎樣使用的Pandas的MultiIndex多層索引是怎樣使用的

Pandas的MultiIndex多層索引是怎樣使用的Pandas的MultiIndex多層索引是怎樣使用的

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:指定根據哪一層進行排序,默認為最外(上)層。該值可以是數值,索引名,或者是由二者構成的列表。

  • 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方法,可以進行索引堆疊,即將指定層級的列轉換成行。

  • level:指定轉換的層級,默認為-1。

# 進行堆疊  列->行      取消堆疊   行->列
df.stack()                     df.unstack()
2.6.取消堆疊

通過DataFrame對象的unstack方法,可以取消索引堆疊,即將指定層級的行轉換成列。 level:指定轉換的層級,默認為-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)

Pandas的MultiIndex多層索引是怎樣使用的

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

Pandas的MultiIndex多層索引是怎樣使用的

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

Pandas的MultiIndex多層索引是怎樣使用的

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

Pandas的MultiIndex多層索引是怎樣使用的

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

Pandas的MultiIndex多層索引是怎樣使用的

2.7.設置索引

在DataFrame中,如果我們需要將現有的某一(幾)列作為索引列,可以調用set_index方法來實現。

  • Signature: df.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)

  • drop:是否丟棄作為新索引的列,默認為True。

  • append:是否以追加的方式設置索引,默認為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)

Pandas的MultiIndex多層索引是怎樣使用的

2.8.重置索引

調用在DataFrame對象的reset_index,可以重置索引。該操作與set_index正好相反。

  • Signature: df.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')

  • level:重置索引的層級,默認重置所有層級的索引。如果重置所有索引,將會創建默認整數序列索引。

  • 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)

Pandas的MultiIndex多層索引是怎樣使用的

看完上述內容,你們掌握Pandas的MultiIndex多層索引是怎樣使用的的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

萨迦县| 集贤县| 奈曼旗| 科技| 调兵山市| 天长市| 收藏| 清丰县| 新源县| 东安县| 额尔古纳市| 宣威市| 彭泽县| 嘉义市| 广东省| 开阳县| 张家口市| 昌邑市| 辽中县| 南澳县| 施甸县| 六枝特区| 丰原市| 雅安市| 泸定县| 柳江县| 临湘市| 乌兰察布市| 根河市| 德令哈市| 盐津县| 南雄市| 古田县| 锡林浩特市| 阳曲县| 霍城县| 鹰潭市| 南丹县| 张北县| 韶山市| 永吉县|