python?pandas創(chuàng)建多層索引MultiIndex的6種方式
引言
在上一篇文章中介紹了如何創(chuàng)建Pandas中的單層索引,今天給大家?guī)?lái)的是如何創(chuàng)建Pandas中的多層索引。
pd.MultiIndex,即具有多個(gè)層次的索引。通過(guò)多層次索引,我們就可以操作整個(gè)索引組的數(shù)據(jù)。本文主要介紹在Pandas中創(chuàng)建多層索引的6種方式:
- pd.MultiIndex.from_arrays():多維數(shù)組作為參數(shù),高維指定高層索引,低維指定低層索引。
- pd.MultiIndex.from_tuples():元組的列表作為參數(shù),每個(gè)元組指定每個(gè)索引(高維和低維索引)。
- pd.MultiIndex.from_product():一個(gè)可迭代對(duì)象的列表作為參數(shù),根據(jù)多個(gè)可迭代對(duì)象元素的笛卡爾積(元素間的兩兩組合)進(jìn)行創(chuàng)建索引。
- pd.MultiIndex.from_frame:根據(jù)現(xiàn)有的數(shù)據(jù)框來(lái)直接生成
- groupby():通過(guò)數(shù)據(jù)分組統(tǒng)計(jì)得到
- pivot_table():生成透視表的方式來(lái)得到

pd.MultiIndex.from_arrays()
In [1]:
import pandas as pd import numpy as np
通過(guò)數(shù)組的方式來(lái)生成,通常指定的是列表中的元素:
In [2]:
# 列表元素是字符串和數(shù)字
array1 = [["xiaoming","guanyu","zhangfei"],
[22,25,27]
]
m1 = pd.MultiIndex.from_arrays(array1)
m1
Out[2]:
MultiIndex([('xiaoming', 22), ( 'guanyu', 25), ('zhangfei', 27)],
)
In [3]:
type(m1) # 查看數(shù)據(jù)類(lèi)型
通過(guò)type函數(shù)來(lái)查看數(shù)據(jù)類(lèi)型,發(fā)現(xiàn)的確是:MultiIndex
Out[3]:
pandas.core.indexes.multi.MultiIndex
在創(chuàng)建的同時(shí)可以指定每個(gè)層級(jí)的名字:
In [4]:
# 列表元素全是字符串
array2 = [["xiaoming","guanyu","zhangfei"],
["male","male","female"]
]
m2 = pd.MultiIndex.from_arrays(
array2,
# 指定姓名和性別
names=["name","sex"])
m2
Out[4]:
MultiIndex([('xiaoming', 'male'), ( 'guanyu', 'male'), ('zhangfei', 'female')],
names=['name', 'sex'])
下面的例子是生成3個(gè)層次的索引且指定名字:
In [5]:
array3 = [["xiaoming","guanyu","zhangfei"],
["male","male","female"],
[22,25,27]
]
m3 = pd.MultiIndex.from_arrays(
array3,
names=["姓名","性別","年齡"])
m3
Out[5]:
MultiIndex([('xiaoming', 'male', 22), ( 'guanyu', 'male', 25), ('zhangfei', 'female', 27)],
names=['姓名', '性別', '年齡'])
pd.MultiIndex.from_tuples()
通過(guò)元組的形式來(lái)生成多層索引:
In [6]:
# 元組的形式
array4 = (("xiaoming","guanyu","zhangfei"),
(22,25,27)
)
m4 = pd.MultiIndex.from_arrays(array4)
m4
Out[6]:
MultiIndex([('xiaoming', 22), ( 'guanyu', 25), ('zhangfei', 27)],
)
In [7]:
# 元組構(gòu)成的3層索引
array5 = (("xiaoming","guanyu","zhangfei"),
("male","male","female"),
(22,25,27))
m5 = pd.MultiIndex.from_arrays(array5)
m5
Out[7]:
MultiIndex([('xiaoming', 'male', 22), ( 'guanyu', 'male', 25), ('zhangfei', 'female', 27)],
)
列表和元組是可以混合使用的
- 最外層是列表
- 里面全部是元組
In [8]:
array6 = [("xiaoming","guanyu","zhangfei"),
("male","male","female"),
(18,35,27)
]
# 指定名字
m6 = pd.MultiIndex.from_arrays(array6,names=["姓名","性別","年齡"])
m6
Out[8]:
MultiIndex([('xiaoming', 'male', 18), ( 'guanyu', 'male', 35), ('zhangfei', 'female', 27)],
names=['姓名', '性別', '年齡'] # 指定名字
)
pd.MultiIndex.from_product()
使用可迭代對(duì)象的列表作為參數(shù),根據(jù)多個(gè)可迭代對(duì)象元素的笛卡爾積(元素間的兩兩組合)進(jìn)行創(chuàng)建索引。
在Python中,我們使用 isinstance()函數(shù) 判斷python對(duì)象是否可迭代:
# 導(dǎo)入 collections 模塊的 Iterable 對(duì)比對(duì)象 from collections import Iterable


通過(guò)上面的例子我們總結(jié):常見(jiàn)的字符串、列表、集合、元組、字典都是可迭代對(duì)象
下面舉例子來(lái)說(shuō)明:
In [18]:
names = ["xiaoming","guanyu","zhangfei"]
numbers = [22,25]
m7 = pd.MultiIndex.from_product(
[names, numbers],
names=["name","number"]) # 指定名字
m7
Out[18]:
MultiIndex([('xiaoming', 22), ('xiaoming', 25), ( 'guanyu', 22), ( 'guanyu', 25), ('zhangfei', 22), ('zhangfei', 25)],
names=['name', 'number'])
In [19]:
# 需要展開(kāi)成列表形式
strings = list("abc")
lists = [1,2]
m8 = pd.MultiIndex.from_product(
[strings, lists],
names=["alpha","number"])
m8
Out[19]:
MultiIndex([('a', 1), ('a', 2), ('b', 1), ('b', 2), ('c', 1), ('c', 2)],
names=['alpha', 'number'])
In [20]:
# 使用元組形式
strings = ("a","b","c")
lists = [1,2]
m9 = pd.MultiIndex.from_product(
[strings, lists],
names=["alpha","number"])
m9
Out[20]:
MultiIndex([('a', 1), ('a', 2), ('b', 1), ('b', 2), ('c', 1), ('c', 2)],
names=['alpha', 'number'])
In [21]:
# 使用range函數(shù)
strings = ("a","b","c") # 3個(gè)元素
lists = range(3) # 0,1,2 3個(gè)元素
m10 = pd.MultiIndex.from_product(
[strings, lists],
names=["alpha","number"])
m10
Out[21]:
MultiIndex([('a', 0), ('a', 1), ('a', 2), ('b', 0), ('b', 1), ('b', 2), ('c', 0), ('c', 1), ('c', 2)],
names=['alpha', 'number'])
In [22]:
# 使用range函數(shù)
strings = ("a","b","c")
list1 = range(3) # 0,1,2
list2 = ["x","y"]
m11 = pd.MultiIndex.from_product(
[strings, list1, list2],
names=["name","l1","l2"]
)
m11 # 總個(gè)數(shù) 3*3*2=18
總個(gè)數(shù)是``332=18`個(gè):
Out[22]:
MultiIndex([('a', 0, 'x'), ('a', 0, 'y'), ('a', 1, 'x'), ('a', 1, 'y'), ('a', 2, 'x'), ('a', 2, 'y'), ('b', 0, 'x'), ('b', 0, 'y'), ('b', 1, 'x'), ('b', 1, 'y'), ('b', 2, 'x'), ('b', 2, 'y'), ('c', 0, 'x'), ('c', 0, 'y'), ('c', 1, 'x'), ('c', 1, 'y'), ('c', 2, 'x'), ('c', 2, 'y')],
names=['name', 'l1', 'l2'])
pd.MultiIndex.from_frame()
通過(guò)現(xiàn)有的DataFrame直接來(lái)生成多層索引:
df = pd.DataFrame({"name":["xiaoming","guanyu","zhaoyun"],
"age":[23,39,34],
"sex":["male","male","female"]})
df

直接生成了多層索引,名字就是現(xiàn)有數(shù)據(jù)框的列字段:
In [24]:
pd.MultiIndex.from_frame(df)
Out[24]:
MultiIndex([('xiaoming', 23, 'male'), ( 'guanyu', 39, 'male'), ( 'zhaoyun', 34, 'female')],
names=['name', 'age', 'sex'])
通過(guò)names參數(shù)來(lái)指定名字:
In [25]:
# 可以自定義名字 pd.MultiIndex.from_frame(df,names=["col1","col2","col3"])
Out[25]:
MultiIndex([('xiaoming', 23, 'male'), ( 'guanyu', 39, 'male'), ( 'zhaoyun', 34, 'female')],
names=['col1', 'col2', 'col3'])
groupby()
通過(guò)groupby函數(shù)的分組功能計(jì)算得到:
In [26]:
df1 = pd.DataFrame({"col1":list("ababbc"),
"col2":list("xxyyzz"),
"number1":range(90,96),
"number2":range(100,106)})
df1
Out[26]:

df2 = df1.groupby(["col1","col2"]).agg({"number1":sum,
"number2":np.mean})
df2

查看數(shù)據(jù)的索引:
In [28]:
df2.index
Out[28]:
MultiIndex([('a', 'x'), ('a', 'y'), ('b', 'x'), ('b', 'y'), ('b', 'z'), ('c', 'z')],
names=['col1', 'col2'])
pivot_table()
通過(guò)數(shù)據(jù)透視功能得到:
In [29]:
df3 = df1.pivot_table(values=["col1","col2"],index=["col1","col2"]) df3

In [30]:
df3.index
Out[30]:
MultiIndex([('a', 'x'), ('a', 'y'), ('b', 'x'), ('b', 'y'), ('b', 'z'), ('c', 'z')],
names=['col1', 'col2'])以上就是python pandas創(chuàng)建多層索引MultiIndex的6種方式的詳細(xì)內(nèi)容,更多關(guān)于python pandas多層索引MultiIndex的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python中的decimal類(lèi)型轉(zhuǎn)換實(shí)例詳解
decimal 模塊實(shí)現(xiàn)了定點(diǎn)和浮點(diǎn)算術(shù)運(yùn)算符,使用的是大多數(shù)人所熟悉的模型,而不是程序員熟悉的模型,即大多數(shù)計(jì)算機(jī)硬件實(shí)現(xiàn)的 IEEE 浮點(diǎn)數(shù)運(yùn)算。這篇文章主要介紹了python里的decimal類(lèi)型轉(zhuǎn)換,需要的朋友可以參考下2019-06-06
Python實(shí)現(xiàn)輸出程序執(zhí)行進(jìn)度百分比的方法
這篇文章主要介紹了Python實(shí)現(xiàn)輸出程序執(zhí)行進(jìn)度百分比的方法,涉及Python數(shù)值運(yùn)算與系統(tǒng)輸出相關(guān)操作技巧,需要的朋友可以參考下2017-09-09
Python導(dǎo)出數(shù)據(jù)到Excel可讀取的CSV文件的方法
這篇文章主要介紹了Python導(dǎo)出數(shù)據(jù)到Excel可讀取的CSV文件的方法,設(shè)計(jì)Python操作Excel的相關(guān)技巧,需要的朋友可以參考下2015-05-05
python安裝庫(kù)的最詳細(xì)方法(以安裝pygame庫(kù)為例)
在學(xué)習(xí)了一個(gè)學(xué)期的python之后,我決定對(duì)pygame下手了,下面這篇文章主要給大家介紹了關(guān)于python安裝庫(kù)的最詳細(xì)方法,本文主要以安裝pygame庫(kù)為例,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
python3 pathlib庫(kù)Path類(lèi)方法總結(jié)
這篇文章主要介紹了python3 pathlib庫(kù)Path類(lèi)方法總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
在django-xadmin中APScheduler的啟動(dòng)初始化實(shí)例
今天小編就為大家分享一篇在django-xadmin中APScheduler的啟動(dòng)初始化實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
Python將主機(jī)名轉(zhuǎn)換為IP地址的方法
今天小編就為大家分享一篇Python將主機(jī)名轉(zhuǎn)換為IP地址的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
解決pymongo連接數(shù)據(jù)庫(kù)報(bào)錯(cuò)certificate verify failed:certific
這篇文章主要介紹了解決pymongo連接數(shù)據(jù)庫(kù)報(bào)錯(cuò)certificate verify failed:certificate has expired問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01

