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: 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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443861.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443861.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443861.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《這是全網最硬核redis總結,誰贊成,誰反對?》六萬字大合集

我攤牌了,這篇文章,值得99%的人收藏 此文后續會改為粉絲可見,所以喜歡的請提前關注和收藏,不迷路。 最近有五本我喜歡的redis實體新書,想要的去評論,我寫個隨機數抽獎包郵送給你。 那么,準備好…

Python數據預處理之異常值的處理——【自定義的three_sigma()函數、boxplot()方法】

文章目錄基于3σ原則檢測異常值代碼實現測試基于箱型圖檢測異常值異常值的處理基于3σ原則檢測異常值 3σ原則,又稱拉依達準則。是指假設一組檢測數據只含有隨機誤差。對其進行計算處理得到標準偏差,按一定概率確定一個區間,凡是超過這個區間…

那個谷歌的網紅扔雞蛋的題,來看看教科書式的回答

leetcode頂級難題,谷歌面試天天問,來看看吧,帶你來一步一步達到最優解。 谷歌不知道問了多少遍,藍橋杯也出現過,leetcode上是頂級難題,到底是什么題能如此頻繁地出現?我們一探究竟吧。 原題描述…

Python更改數據類型——astype()方法和to_numeric()函數

文章目錄明確指定數據的類型通過dtypes屬性進行查看創建Pandas對象指定數據類型轉換數據類型通過astype()方法強制轉換數據的類型通過to_numeric()函數轉換數據類型明確指定數據的類型 通過dtypes屬性進行查看 import pandas as pddf pd.DataFrame({A: [1, 2, 4],B: [9, -80…

不騙你,沒讀這一篇,你不可能懂二分

上篇文章講動態規劃獲得了80k瀏覽,這次的二分也值得你們一看,這個系列是特別用心寫的,準備出書的哦 動態規劃 3.0 引子 圖書館自習的時候,一女生背著一堆書進閱覽室,結果警報響了,大媽讓女生看是哪本書把警報弄響了,女生把書倒出…

Python之數據合并——【concat()函數、merge()函數、join()方法、combine_first()方法】

文章目錄軸向堆疊數據——concat()函數橫向堆疊與外連接縱向堆疊與內連接主鍵合并數據——merge()函數內連接方式外連接方式左連接方式右連接方式其他根據行索引合并數據——join()方法四種連接方式行索引與列索引重疊合并重疊數據——combine_first()方法軸向堆疊數據——conc…

超硬核!操作系統學霸筆記,考試復習面試全靠它

之后會發布基于基礎知識的大部分算法的模擬代碼合集,敬請關注。 進程基礎 進程的基本概念 程序順序執行的特征: 1)順序性:處理機嚴格按照程序所規定的順序執行,每一步操作必須在下一步操作開始前執行 2)封…

配置tomcat6.0的HTTPS(單向)

利用JDK自帶的產生證書的工具 生成證書 建立一個腳本文件,內容如下: set SERVER_DN"CNServer, OUshare, Oshare, Lsz, Sgd, CCN" set CLIENT_DN"CNClient, OUshare, Oshare, Lsz, Sgd, CCN" set KS_PASS-storepass changeit set KE…

Python之數據重塑——【stack()方法和unstack()方法、pivot()方法】

文章目錄重塑層次化索引對于單層索引的DataFrame類對象stack()方法unstack()方法對于多層索引的DataFrame類對象辨析操作內層索引與外層索引的區別查看多層索引對象轉換后的類型軸向旋轉——pivot()方法重塑層次化索引 Pandas中重塑層次化索引的操作主要是stack()方法和unstac…

超硬核!學霸把操作系統經典算法給敲完了!要知行合一

上期的筆記,瀏覽快1萬了,既然關注的人很多,那就發出來承諾過的算法全模擬,希望幫到你們。 上期的操作系統學霸筆記,考試復習面試全靠它 一、模擬進程調度 功能 data.h #ifndef _Data_h_ #define _Data_h_#include …

Python之數據轉換——【rename()方法、cut()函數、get_dummies()函數】

文章目錄重命名軸索引離散化連續數據啞變量處理類別型數據重命名軸索引 rename( self, mapper: Optional[Renamer] None, *, index: Optional[Renamer] None, columns: Optional[Renamer] None, axis: Optional[Axis] None, copy: bool True, inplace: bool False, level…

超硬核!數據結構學霸筆記,考試面試吹牛就靠它

上次發操作系統筆記,很快瀏覽上萬,這次數據結構比上次硬核的多哦,同樣的會發超硬核代碼,關注吧。 超硬核!操作系統學霸筆記,考試復習面試全靠它 第一次筆記(復習c,課程概述&#xff…

Python之數據拆分——groupby()方法

文章目錄groupby()方法通過列名進行分組通過Series對象進行分組Series對象與原數據的行索引長度相等Series對象與原數據的行索引長度不等通過字典進行分組按照columns軸的方向進行分組按照index軸的方向進行分組通過函數進行分組groupby()方法 groupby( self, byNone, axis0, l…

超硬核!小白讀了這篇文章,就能在算法圈混了

作為一只超級硬核的兔子,從來不給你說廢話,只有最有用的干貨!這些神級算法送給你 目錄 第一節 1.1bogo排序 1.2位運算 1.3打擂臺 1.4morris遍歷 第二節 2.1睡眠排序 2.2會死的兔子 2.3矩陣快速冪 2.4摔手機/摔雞蛋 時空復雜度目錄 …

Python之數據聚合——aggregate()方法

文章目錄使用內置統計方法聚合數據面向列的聚合方法aggregate()方法對每一列數據應用同一個函數對某列數據應用不同的函數對不同列數據應用不同函數使用內置統計方法聚合數據 實現數據拆分成組并分別計算平均數的操作 代碼: import pandas as pd import numpy as…

超硬核十萬字!全網最全 數據結構 代碼,隨便秒殺老師/面試官,我說的

本文代碼實現基本按照《數據結構》課本目錄順序,外加大量的復雜算法實現,一篇文章足夠。能換你一個收藏了吧? 當然如果落下什么了歡迎大家評論指出 目錄 順序存儲線性表實現 單鏈表不帶頭標準c語言實現 單鏈表不帶頭壓縮c語言實現 約瑟…

Python之分組級運算——【transform()方法、apply()方法】

文章目錄數據轉換——transform()方法數據應用——apply()方法數據轉換——transform()方法 使用aggregate()方法進行聚合運算已經在上一篇博客中詳細闡述,我們知道aggregate()方法返回的數據集的形狀(shape)與被分組的數據集的形狀是不同的…

java限制在同一臺電腦上只允許有一個用戶登錄系統

在web應用系統中,出于安全性考慮,經常需要對同一客戶端登錄的用戶數量和一個客戶同時在多個客戶端登陸進行限制。 具體一點就是: 1、在同一臺電腦上一次只允許有一個用戶登錄系統; 2、一個用戶在同一時間只允許在一個客戶端登錄…

Matplotlib——繪制圖表

文章目錄通過figure()函數創建畫布通過subplot()函數創建單個子圖通過subplots()函數創建多個子圖通過add_subplot()方法添加和選中子圖添加各類標簽繪制常見圖表繪制直方圖——hist()函數繪制散點圖——scatter()函數繪制柱狀圖——bar()函數設定線條的相關參數本地保存圖片通…

限制在同一臺電腦上只允許有一個用戶登錄系統

在web應用系統中,出于安全性考慮,經常需要對同一客戶端登錄的用戶數量和一個客戶同時在多個客戶端登陸進行限制。 具體一點就是: 1、在同一臺電腦上一次只允許有一個用戶登錄系統; 2、一個用戶在同一時間只允許在一個客戶端登錄…