您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關怎么創建一個pandas多層索引,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
普通-多個index創建
在創建數據的時候加入一個index列表,這個index列表里面是多個索引列表
Series多層索引的創建方法
import pandas as pd s = pd.Series([1,2,3,4,5,6],index=[['張三','張三','李四','李四','王五','王五'], ['期中','期末','期中','期末','期中','期末']]) # print(s) s
張三 期中 1
期末 2
李四 期中 3
期末 4
王五 期中 5
期末 6
dtype: int64
import numpy as np data = np.random.randint(0,100,size=(6,3)) # np.random.randint(0,100,size=(6,3))是使用numpy中的隨機模塊random中,生成隨機整數方法randint, # 里面的參數size是指定生成6行3列的數據,并且每個數字的范圍在0到100之間 data
array([[44, 66, 67], [82, 52, 0], [34, 78, 23], [38, 4, 43], [60, 62, 40], [57, 9, 11]])
import pandas as pd import numpy as np data = np.random.randint(0,100,size=(6,3)) df = pd.DataFrame(data,index=[['張三','張三','李四','李四','王五','王五'], ['期中','期末','期中','期末','期中','期末']], columns=['Java','Web','Python']) df
Java | Web | Python | ||
---|---|---|---|---|
張三 | 期中 | 68 | 4 | 90 |
期末 | 33 | 63 | 73 | |
李四 | 期中 | 30 | 13 | 68 |
期末 | 14 | 18 | 48 | |
王五 | 期中 | 34 | 66 | 26 |
期末 | 89 | 10 | 35 |
import pandas as pd import numpy as np data = np.random.randint(0,100,size=(6,3)) names = ['張三','李四','王五'] exam = ['期中','期末'] index = pd.MultiIndex.from_product([names,exam]) df = pd.DataFrame(data,index=index,columns=['Java','Web','Python']) # print(df) df
Java | Web | Python | ||
---|---|---|---|---|
張三 | 期中 | 51 | 78 | 47 |
期末 | 39 | 53 | 36 | |
李四 | 期中 | 33 | 60 | 83 |
期末 | 90 | 55 | 3 | |
王五 | 期中 | 37 | 45 | 66 |
期末 | 6 | 82 | 71 |
from_product()在這個里面的列表中位置不同, 產生的索引頁會不同
index = pd.MultiIndex.from_product([exam, names]) df = pd.DataFrame(data,index=index,columns=['Java','Web','Python']) # print(df) df
Java | Web | Python | ||
---|---|---|---|---|
期中 | 張三 | 51 | 78 | 47 |
李四 | 39 | 53 | 36 | |
王五 | 33 | 60 | 83 | |
期末 | 張三 | 90 | 55 | 3 |
李四 | 37 | 45 | 66 | |
王五 | 6 | 82 | 71 |
from_product([exam,names])會將列表中第一個元素作為最外層索引,依次類推
獲取到我們想要的數據
創建數據
import pandas as pd s = pd.Series([1,2,3,4,5,6],index=[['張三','張三','李四','李四','王五','王五'], ['期中','期末','期中','期末','期中','期末']]) print(s)
張三 期中 1
期末 2
李四 期中 3
期末 4
王五 期中 5
期末 6
dtype: int64
可以直接使用[]的方式取最外面的一個層級 s[‘張三']
s['李四'] # 注意:[]取值方式,不可直接使用最外層以外的其他層級,例如:s['期末']
期中 3
期末 4
dtype: int64
使用['外索引', '內索引'], 獲取某個數據
注意:[‘張三',‘期末']他們的順序不能變。剝洋蔥原則,從外到內一層一層的剝。
s['李四', '期中'] # 李四期中分值 # 注意:['張三','期末']他們的順序不能變。剝洋蔥原則,從外到內一層一層的剝。
3
使用[]的切片,獲取數據s[:,‘期中']
s[:,'期中'] # 第一個值為全部的外索引
張三 1
李四 3
王五 5
dtype: int64
loc 使用的是標簽suoyin
iloc使用的是位置索引
# loc 使用方式與 [] 的方式基本一樣 s.loc['張三'] s.loc['張三','期中'] s.loc[:,'期中'] # iloc 的取值并不會受多層索引影響,只會根據數據的位置索引進行取值, 不推薦
張三 1
李四 3
王五 5
dtype: int64
在對多層索引DataFrame的取值是,推薦使用 loc() 函數
import pandas as pd import numpy as np #size參數是指定生成6行3列的數組 data = np.random.randint(0,100,size=(6,3)) names = ['張三','李四','王五'] exam = ['期中','期末'] index = pd.MultiIndex.from_product([names,exam]) df = pd.DataFrame(data,index=index,columns=['Java','Web','Python']) df
Java | Web | Python | ||
---|---|---|---|---|
張三 | 期中 | 3 | 40 | 52 |
期末 | 74 | 38 | 85 | |
李四 | 期中 | 7 | 28 | 16 |
期末 | 9 | 25 | 0 | |
王五 | 期中 | 13 | 24 | 8 |
期末 | 49 | 46 | 1 |
三種方式都可以獲取張三期中各科成績
# df.loc['張三','期中'] # df.loc['張三'].loc['期中'] # df.loc[('張三','期中')]
注意:DataFrame中對行索引的時候和Series有一個同樣的注意點,就是無法直接對二級索引直接進行索引,必須讓二級索引變成一級索引后才能對其進行索引
使用sort_index() 排序
level參數可以指定是否按照指定的層級進行排列
第一層索引值為0, 第二層索引的值為1
創建數據
import pandas as pd data = np.random.randint(0,100,size=(9,3)) key1 = ['b','c','a'] key2 = [2,1,3] index = pd.MultiIndex.from_product([key1,key2]) df = pd.DataFrame(data,index=index,columns=['Java','Web','Python']) df
Java | Web | Python | ||
---|---|---|---|---|
b | 2 | 56 | 82 | 81 |
1 | 84 | 16 | 55 | |
3 | 35 | 25 | 86 | |
c | 2 | 76 | 1 | 76 |
1 | 36 | 28 | 94 | |
3 | 79 | 70 | 97 | |
a | 2 | 25 | 17 | 30 |
1 | 38 | 38 | 78 | |
3 | 41 | 75 | 90 |
DataFrame按行索引排序的方法是sort_index()
如果直接使用的話,不傳參數, 會把每一層索引根據值進行升序排序
df.sort_index()
Java | Web | Python | ||
---|---|---|---|---|
a | 1 | 18 | 60 | 74 |
2 | 66 | 87 | 27 | |
3 | 96 | 18 | 64 | |
b | 1 | 72 | 58 | 52 |
2 | 22 | 31 | 22 | |
3 | 31 | 12 | 83 | |
c | 1 | 6 | 54 | 96 |
2 | 9 | 47 | 18 | |
3 | 31 | 63 | 4 |
# 當level=0時,ascending=False, 會根據第一層索引值進行降序排序 df.sort_index(level=0,ascending=False)
Java | Web | Python | ||
---|---|---|---|---|
c | 3 | 79 | 70 | 97 |
2 | 76 | 1 | 76 | |
1 | 36 | 28 | 94 | |
b | 3 | 35 | 25 | 86 |
2 | 56 | 82 | 81 | |
1 | 84 | 16 | 55 | |
a | 3 | 41 | 75 | 90 |
2 | 25 | 17 | 30 | |
1 | 38 | 38 | 78 |
# 當level=1時,會根據第二層索引值進行降序排序 df.sort_index(level=1,ascending=False) # 數據會根據第二層索引值進行相應的降序排列, # 如果索引值相同時會根據其他層索引值排列
Java | Web | Python | ||
---|---|---|---|---|
c | 3 | 79 | 70 | 97 |
b | 3 | 35 | 25 | 86 |
a | 3 | 41 | 75 | 90 |
c | 2 | 76 | 1 | 76 |
b | 2 | 56 | 82 | 81 |
a | 2 | 25 | 17 | 30 |
c | 1 | 36 | 28 | 94 |
b | 1 | 84 | 16 | 55 |
a | 1 | 38 | 38 | 78 |
通過level設置排序的索引層級,其他層索引也會根據其排序規則進行排序
關于怎么創建一個pandas多層索引就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。