iT邦幫忙

0

Python學習筆記: Pandas MultiIndex (多重索引)簡要說明

  • 分享至 

  • xImage
  •  

本文同步發表於小弟自架網站:微確幸資訊站

資料範例是索引共有四層(0-3層),分別為['學年', '學期', '學制', '性別']
學年:108, 109
學期:1, 2
學制:"博士班", "碩士班", "大學部"
性別:"女", "男"
先看一下資料在Excel中的顯示:
https://ithelp.ithome.com.tw/upload/images/20221214/20122335WgrLyWj5cZ.jpg

import pandas as pd
import numpy as np
year = [108, 109]
semester = [1, 2]
academic = ['博士班', '碩士班', '大學部']
gender = ['女', '男']
index = pd.MultiIndex.from_product([year, semester, academic, gender],
                           names=['學年', '學期', '學制', '性別'])
df = pd.DataFrame(np.random.randint(300,size=(24,1)),index=index,columns=["學生人數"])
df

輸出結果太長,只截圖一部份:
https://ithelp.ithome.com.tw/upload/images/20221214/20122335P5n8BSxnY5.jpg

多重索引的樣子:

df.index

https://ithelp.ithome.com.tw/upload/images/20221214/20122335EG9GMhhJIh.jpg

多重索引的名字是FrozenList

df.index.names

FrozenList(['學年', '學期', '學制', '性別'])

# 多重索引第0層,也就是"學年"
df.index.get_level_values(0)

Int64Index([108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 109,
109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109],
dtype='int64', name='學年')

# 多重索引直接帶入"學年",得到第0層的索引
df.index.get_level_values('學年')

Int64Index([108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 109,
109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109],
dtype='int64', name='學年')

# 多重索引第1層,也就是"學期"
df.index.get_level_values(1)

Int64Index([1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
2, 2],
dtype='int64', name='學期')

# 多重索引直接帶入"學期",得到第1層的索引
df.index.get_level_values('學期')

Int64Index([1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
2, 2],
dtype='int64', name='學期')

以下類推第2層是"學制",第3層是"性別"

多重索引篩選資料

第0層資料,例如108學年資料

df.loc[(108)]
#df.loc[108] #中括號裏面沒有小括號也可以

https://ithelp.ithome.com.tw/upload/images/20221214/201223358P5FlWcnmG.jpg

第1層資料,例如109學年第2學期資料

df.loc[(109, 2)]

https://ithelp.ithome.com.tw/upload/images/20221214/20122335kS8JfMPnlA.jpg

第2、3層資料,就以上小括號裏面再把"學制"和"性別"的值帶進去就可以得到。

多重索引更改不同索引層的值

將第0層索引[108, 109]更改為[2019, 2020]

dfcopy = df.copy()
dfcopy.index = dfcopy.index.set_levels([2019, 2020] , level=0)
dfcopy

輸出結果太長,只截圖一部份:
https://ithelp.ithome.com.tw/upload/images/20221214/20122335qpC34lZwlH.jpg

將第0層索引[108, 109]及第1層索引[1, 2]分別更改為[2019, 2020]與['one', 'two']

dfcopy = df.copy()
dfcopy.index = dfcopy.index.set_levels([[2019, 2020], ['one', 'two']] , level=[0,1])
dfcopy

輸出結果太長,只截圖一部份:
https://ithelp.ithome.com.tw/upload/images/20221214/20122335d9nnFZXjIS.jpg


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言