pandas中DataFrame多層索引的實(shí)現(xiàn)
1、創(chuàng)建
相較于一層索引,在創(chuàng)建多層索引時(shí)給字段添加關(guān)系,其創(chuàng)建方法包括運(yùn)用元組、數(shù)組、笛卡爾積,在普通DataFrame中創(chuàng)立。
1.1方式一使用pd.MultiIndex.from_tuples創(chuàng)建索引
tuples為元組 含義就是使用pandas中用元組建立多層索引
import pandas as pd import numpy as np #這里創(chuàng)建的兩層索引,姓名、考試 index_lables=[('張三','期中'),('張三','期末'),('李四','期中'),('李四','期末')] mult_index = pd.MultiIndex.from_tuples(index_lables,names=('name','exam')) data = { 'python':[98,149,130,147], 'math':[95,78,143,104] } df=pd.DataFrame(data,index=mult_index)
1.2方式二:使用pd.MultiIndex.from_arrays(數(shù)組)
index_labels = [['張三','張三','李四','李四'],['期中','期末','期中','期末']] mult_index=pd.MultiIndex.from_arrays(index_labels,names=('name','exam')) df=pd.DataFrame(data,index=mult_index)
1.3方式三:使用pd.MultiIndex.from_product(笛卡爾積)
index_lables=pd.MultiIndex.from_product([['張三','李四','王五','趙六'], ['期中','期末']], names=['name','exam']) df=pd.DataFrame(np.random.randint(80,150, size=(8,2)), index=index_lables, columns=['python','math'] ) df1=pd.DataFrame(np.random.randint(80,150,size=(2,4)), index=['張三','李四'], columns=pd.MultiIndex.from_product([['python','math'],['期中','期末']]))
笛卡爾積使用的不同其創(chuàng)建的dataframe也不同
df1
df
1.4方式四在已有的DataFrame基礎(chǔ)上創(chuàng)建
使用set_index方法進(jìn)行創(chuàng)建
參數(shù):
keys,要設(shè)置為索引的列名(如有多個(gè)應(yīng)放在一個(gè)列表里)
drop: bool = True,將設(shè)置為索引的列刪除,默認(rèn)為True
append: bool = False,是否將新的索引追加到原索引后(即是否保留原索引),默認(rèn)為False
inplace: bool = False, 是否在原DataFrame上修改,默認(rèn)為False
verify_integrity: bool = False,是否檢查索引有無重復(fù),默認(rèn)為False
示例:
import pandas as pd import numpy as np data={ 'year':[2020,2020,2021,2021,2022,2022], 'quarter':[1,2,1,2,1,2], 'sales':[100,150,120,130,140,180], 'profit':[50,80,80,100,30,80] } df=pd.DataFrame(data) print(df) df.set_index(['year','quarter'],inplace=True) print(df)
2、篩選數(shù)據(jù)
多層索引的DataFrame的index(每一行的下標(biāo))為元組
print(df.index)
在篩選數(shù)據(jù)時(shí),與普通的DataFrame一致,可以通過標(biāo)簽、位置、字段名、切片進(jìn)行篩選
根據(jù)標(biāo)簽索引
print(df.loc[[2020,2021]]) print(df.loc[(2020,1)])#與df.loc[2020].loc[1]一致 print(df.loc[[(2020,1),(2020,2)]]) print(df.loc[(2020,1):(2021,2)])
根據(jù)位置索引
print(df.iloc[[0,1]]) print(df.iloc[0:4,[0]])#如果‘,'的0不加[],則該列為series
3、分層計(jì)算
之前DataFrame的統(tǒng)計(jì)函數(shù)有l(wèi)evel參數(shù),能夠給多層索引DataFrame運(yùn)用,但已被舍棄,現(xiàn)在想要運(yùn)算需要使用:DataFrame.groupby(level=層數(shù)).函數(shù)名()
我們以例子進(jìn)行說明:(這個(gè)輸出的DataFrame有點(diǎn)丑,別介意)
import pandas as pd import numpy as np df=pd.DataFrame(np.random.randint(0,151,size=(40,3)), index=pd.MultiIndex.from_product([ list('ABCDEFGHIJ'),['期中','期末'],['平時(shí)成績','考試成績']]), columns=['math','python','english'] ) print(df)
我們先來看層級(jí),最左邊的標(biāo)簽為字母,然后是“期中/期末”,最后是成績類別,所以對應(yīng)的層數(shù)為0,1,2。弄清楚之后,我們使用代碼看看運(yùn)算結(jié)果。
print(df.groupby(level=0).mean()) print(df.groupby(level=1).mean()) print(df.groupby(level=2).mean())
level=1
level=2|level=3
可以看出,level=0時(shí),根據(jù)每個(gè)同學(xué)的其他4項(xiàng)計(jì)算各科平均分,level=1時(shí),計(jì)算期中期末的平均分。
到此這篇關(guān)于pandas中DataFrame多層索引的實(shí)現(xiàn) 的文章就介紹到這了,更多相關(guān)pandas DataFrame多層索引內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python數(shù)據(jù)分析之如何利用pandas查詢數(shù)據(jù)示例代碼
查詢和分析數(shù)據(jù)是pandas的重要功能,也是我們學(xué)習(xí)pandas的基礎(chǔ),下面這篇文章主要給大家介紹了關(guān)于Python數(shù)據(jù)分析之如何利用pandas查詢數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09Matplotlib繪制混淆矩陣的實(shí)現(xiàn)
對于機(jī)器學(xué)習(xí)多分類模型來說,其評價(jià)指標(biāo)除了精度之外,常用的還有混淆矩陣和分類報(bào)告,下面來展示一下如何繪制混淆矩陣,這在論文中經(jīng)常會(huì)用到。感興趣的可以了解一下2021-05-05解決Atom安裝Hydrogen無法運(yùn)行python3的問題
今天小編就為大家分享一篇解決Atom安裝Hydrogen無法運(yùn)行python3的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08Python的collections模塊中的OrderedDict有序字典
字典是無序的,但是collections的OrderedDict類為我們提供了一個(gè)有序的字典結(jié)構(gòu),名副其實(shí)的Ordered+Dict,下面通過兩個(gè)例子來簡單了解下Python的collections模塊中的OrderedDict有序字典:2016-07-07