Pandas对象的层次化索引——【from_tuples()、from_arrays()、from_product()、swaplevel()、sort_index()、sort_values()】
文章目錄
- 層次化索引的概念
 - 層次化索引的創建
 - 使用嵌套列表的方式構造層次化索引對象
 - 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: int64DataFrame對象
嵌套函數中兩個列表的長度必須是保持一致的,否則將會出現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 5sort_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總結
以上是生活随笔為你收集整理的Pandas对象的层次化索引——【from_tuples()、from_arrays()、from_product()、swaplevel()、sort_index()、sort_values()】的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 信用卡证件过期或异常是什么意思?可以这么
 - 下一篇: 信用卡年费逾期有利息吗?全额计息不划算