文章目錄
- 層次化索引的概念
- 層次化索引的創建
- 使用嵌套列表的方式構造層次化索引對象
- Series對象
- DataFrame對象
- 通過MultiIndex類的方法構建層次化索引
- 通過from_tuples()方法創建MultiIndex對象
- 通過from_arrays()方法創建MultiIndex對象
- 通過from_product()方法創建MultiIndex對象
- 層次化索引的操作
- 選取子集
- 獲取外層索引子集
- 獲取內層索引子集
- 交換分層順序——swaplevel()
- 排序分層
- sort_index()
- sort_values()
層次化索引的概念
只有一層索引結構(行索引、列索引)的Pandas對象稱為單層索引,層次化索引可以理解為單層索引的延申,即在一個軸方向上具有多層索引。
層次化索引的創建
使用嵌套列表的方式構造層次化索引對象
Series對象
使用構造方法創造Series對象時,index參數接收了一個嵌套列表來設置索引的層級。
嵌套的第一個列表會作為外層索引,第二個列表會作為內層索引。
import pandas as pd
import numpy as npse = pd.Series([1, 2, 3, 4, 5, 6, 7, 8],index=[['河北省', '河北省', '河北省', '河北省','河南省', '河南省', '河南省', '河南省'],['石家莊', '唐山', '邯鄲', '秦皇島', '鄭州', '開封', '洛陽', '新鄉']])
print(se)
輸出結果:
河北省 石家莊 1唐山 2邯鄲 3秦皇島 4
河南省 鄭州 5開封 6洛陽 7新鄉 8
dtype: int64
DataFrame對象
嵌套函數中兩個列表的長度必須是保持一致的,否則將會出現ValueError錯誤。
df = DataFrame([1, 2, 3, 4, 5, 6, 7, 8],index=[['河北省', '河北省', '河北省', '河北省','河南省', '河南省', '河南省', '河南省'],['石家莊', '唐山', '邯鄲', '秦皇島', '鄭州', '開封', '洛陽', '新鄉']],columns=['占地面積'])
print(df)
df1 = DataFrame({'占地面積': [1, 2, 3, 4, 5, 6, 7, 8]},index=[['河北省', '河北省', '河北省', '河北省','河南省', '河南省', '河南省', '河南省'],['石家莊', '唐山', '邯鄲', '秦皇島', '鄭州', '開封', '洛陽', '新鄉']])
print(df1)
輸出結果: 兩種方式的輸出結果是一致的
占地面積
河北省 石家莊 1唐山 2邯鄲 3秦皇島 4
河南省 鄭州 5開封 6洛陽 7新鄉 8占地面積
河北省 石家莊 1唐山 2邯鄲 3秦皇島 4
河南省 鄭州 5開封 6洛陽 7新鄉 8
通過MultiIndex類的方法構建層次化索引
除了使用嵌套列表的方式構造層次化索引以外,還可以通過MultiIndex類的方法構建一個層次化索引。
MultiIndex類提供了3種創建層次化索引的方法。
MultiIndex.from_tuples():將元組列表轉換為MultiIndex。
MultiIndex.from_arrays():將數組列表轉換為MultiIndex。
MultiIndex.from_product():從多個集合的笛卡爾乘積種創建一個MultiIndex。
MultiIndex類對象種有三個比較重要的屬性
levels : 表示每個級別的唯一標簽
labels : 表示每一個索引列種每個元素在levels中對應的第幾個元素
names :設置索引等級名稱
通過from_tuples()方法創建MultiIndex對象
from_tuples()方法可以將包含若干個元組的列表轉換為MultiIndex對象,其中元組的第一個元素作為外層索引,元組的第二個元素作為內層索引。
from pandas import MultiIndexlist_tuples = [('A', 'A1'), ('A', 'A2'), ('A', 'A3'), ('B', 'B1'), ('B', 'B2')]
# 創建包含多個元組的列表
multi_tuple = MultiIndex.from_tuples(tuples=list_tuples, names=['外層索引', '內層索引'])
# 根據元組列表創建一個MultiIndex對象
print(multi_tuple)
輸出結果:
MultiIndex([('A', 'A1'),('A', 'A2'),('A', 'A3'),('B', 'B1'),('B', 'B2')],names=['外層索引', '內層索引'])
接下來,創建一個DataFrame對象,把剛創建的創建的multi_tuple傳遞給index參數。
import pandas as pdvalue = [[1, 2, 3], [8, 5, 7], [4, 7, 7], [5, 5, 4], [4, 9, 9]]
df_tuple = pd.DataFrame(data=value, index=multi_tuple)
print(df_tuple)
輸出結果:
外層索引 內層索引
A A1 1 2 3A2 8 5 7A3 4 7 7
B B1 5 5 4B2 4 9 9
通過from_arrays()方法創建MultiIndex對象
from_arrays()方法是將數組列表轉換為MultiIndex對象,其中嵌套的第一個列表將作為外層索引,嵌套的第二個列表將作為內層索引。
from pandas import MultiIndexmulti_array = MultiIndex.from_arrays(arrays=[['A', 'B', 'A', 'B', 'B'],['A1', 'A2', 'B1', 'B2', 'B3']],names=['外層索引', '內層索引'])
# 根據列表創建一個MultiIndex對象
print(multi_array)
輸出結果:
MultiIndex([('A', 'A1'),('B', 'A2'),('A', 'B1'),('B', 'B2'),('B', 'B3')],names=['外層索引', '內層索引'])
參數arrays既可以接收列表,也可以接受數組,不過每個列表或者數組的長度必須是相同的。
接下來,創建一個DataFrame對象,把剛剛創建的multi_array傳遞給index參數。
import pandas as pd
import numpy as npvalue1 = np.arange(10).reshape(5, 2)
df_array = pd.DataFrame(data=value1, index=multi_array)
print(df_array)
輸出結果:
0 1
外層索引 內層索引
A A1 0 1
B A2 2 3
A B1 4 5
B B2 6 7B3 8 9
通過from_product()方法創建MultiIndex對象
from_product()方法表示從多個集合的笛卡爾積中創建一個MultiIndex對象。
number = [0, 1, 2]
colors = ['green', 'purple']
multi_product = pd.MultiIndex.from_product(iterables=[number, colors],names=['number', 'color'])
print(multi_product)
輸出結果:
MultiIndex([(0, 'green'),(0, 'purple'),(1, 'green'),(1, 'purple'),(2, 'green'),(2, 'purple')],names=['number', 'color'])
接下來,創建一個DataFrame對象,把剛剛創建的multi_product傳遞給index參數,讓該對象有兩層索引結構。
value2 = np.arange(12).reshape(6, 2)
df_product = pd.DataFrame(data=value2, index=multi_product)
print(df_product)
輸出結果:
0 1
number color
0 green 0 1purple 2 3
1 green 4 5purple 6 7
2 green 8 9purple 10 11
層次化索引的操作
選取子集
創建Series對象
ser_obj = Series([50, 60, 40, 94, 63, 101, 200, 56, 45],index=[['小說', '小說', '小說','散文隨筆', '散文隨筆', '散文隨筆','傳記', '傳記', '傳記'],['高山上的小郵局', '失蹤的總統', '綠毛水怪','皮囊', '浮生六記', '自在獨行','梅西', '老舍自傳', '庫里傳']])
print(ser_obj)
輸出結果:
小說 高山上的小郵局 50失蹤的總統 60綠毛水怪 40
散文隨筆 皮囊 94浮生六記 63自在獨行 101
傳記 梅西 200老舍自傳 56庫里傳 45
dtype: int64
獲取外層索引子集
例如獲取所有外層索引為“小說”的子集
print(ser_obj['小說'])
輸出結果:
高山上的小郵局 50
失蹤的總統 60
綠毛水怪 40
dtype: int64
獲取內層索引子集
例如獲取內層索引為“老舍自傳”的子集
print(ser_obj[:, '老舍自傳'])
輸出結果:
傳記 56
dtype: int64
交換分層順序——swaplevel()
交換分層順序是指交換外層索引和內層索引的位置。
print(ser_obj.swaplevel())
輸出結果:
高山上的小郵局 小說 50
失蹤的總統 小說 60
綠毛水怪 小說 40
皮囊 散文隨筆 94
浮生六記 散文隨筆 63
自在獨行 散文隨筆 101
梅西 傳記 200
老舍自傳 傳記 56
庫里傳 傳記 45
dtype: int64
排序分層
sort_index()
sort_index(
self,
axis=0,
level=None,
ascending=True,
inplace=False,
kind=“quicksort”,
na_position=“last”,
sort_remaining=True,
ignore_index: bool = False,
)
上述方法的部分參數含義如下:
ascending: 是否升序排列,默認為True,升序排列。
在使用sort_index()方法排序時,會優先選擇按外層索引進行排序,然后再按照內層索引進行排序。
創建一個DataFrame對象
df_obj = DataFrame({'word': ['a', 'b', 'd', 'e', 'f', 'k', 'd', 's', 'l'],'num':['1', '2', '4', '5', '3', '2', '6', '2', '3']},index=[['A', 'A', 'A', 'C', 'C', 'C', 'B', 'B', 'B'],[1, 3, 2, 3, 1, 2, 4, 5, 8]])
print(df_obj)
輸出結果:
word num
A 1 a 13 b 22 d 4
C 3 e 51 f 32 k 2
B 4 d 65 s 28 l 3
按索引排序
print(df_obj.sort_index())
輸出結果:
word num
A 1 a 12 d 43 b 2
B 4 d 65 s 28 l 3
C 1 f 32 k 23 e 5
sort_values()
sort_values(
self,
by,
axis=0,
ascending=True,
inplace=False,
kind=“quicksort”,
na_position=“last”,
ignore_index=False,
)
上述方法的部分參數含義如下:
by: 按指定的值排序,是sort_values()必須填寫的參數
按照列索引num進行降序排列
print(df_obj.sort_values(by=['num'], ascending=False))
輸出結果:
word num
B 4 d 6
C 3 e 5
A 2 d 4
C 1 f 3
B 8 l 3
A 3 b 2
C 2 k 2
B 5 s 2
A 1 a 1