Pandas中MultiIndex選擇并提取任何行和列
使用多索引(分層索引)可以方便地對pandas.DataFrame和pandas.Series的索引進(jìn)行分層配置,以便可以為每個層次結(jié)構(gòu)計算統(tǒng)計信息,例如總數(shù)和平均值。
以下csv數(shù)據(jù)為例。每個索引列都命名為level_x。
import pandas as pd df = pd.read_csv('./data/25/sample_multi.csv', index_col=[0, 1, 2]) print(df) # ? ? ? ? ? ? ? ? ? ? ? ? ?val_1 ?val_2 # level_1 level_2 level_3 # A0 ? ? ?B0 ? ? ?C0 ? ? ? ? ?98 ? ? 90 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?44 ? ? ?9 # ? ? ? ? B1 ? ? ?C2 ? ? ? ? ?39 ? ? 17 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?75 ? ? 71 # A1 ? ? ?B2 ? ? ?C0 ? ? ? ? ? 1 ? ? 89 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?54 ? ? 60 # ? ? ? ? B3 ? ? ?C2 ? ? ? ? ?47 ? ? ?6 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?16 ? ? ?5 # A2 ? ? ?B0 ? ? ?C0 ? ? ? ? ?75 ? ? 22 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?19 ? ? ?4 # ? ? ? ? B1 ? ? ?C2 ? ? ? ? ?25 ? ? 52 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?57 ? ? 40 # A3 ? ? ?B2 ? ? ?C0 ? ? ? ? ?64 ? ? 54 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?27 ? ? 96 # ? ? ? ? B3 ? ? ?C2 ? ? ? ? 100 ? ? 77 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?22 ? ? 50 print(df.index) # MultiIndex(levels=[['A0', 'A1', 'A2', 'A3'], ['B0', 'B1', 'B2', 'B3'], ['C0', 'C1', 'C2', 'C3']], # ? ? ? ? ? ?labels=[[0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3], [0, 0, 1, 1, 2, 2, 3, 3, 0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]], # ? ? ? ? ? ?names=['level_1', 'level_2', 'level_3'])
這里,將描述以下內(nèi)容。
- 選擇并提取帶有l(wèi)oc的任何行或列
- 特殊切片規(guī)范:slice(),pd.IndexSlice []
- xs方法
- 給選擇賦值
選擇并提取帶有l(wèi)oc的任何行或列
可以像使用普通索引一樣使用loc []選擇和提取任何行/列。
Pandas獲取和修改任意位置的值(at,iat,loc,iloc)
在示例中,索引是一個多索引,但是當(dāng)列是一個多索引時,同樣的想法也適用。
如果選擇上層(外層),則它與普通loc []相同。
指定整列時,可以省略back slice :,但是使用后述的slice(None)或pd.IndexSlice時,不能將其省略(這會導(dǎo)致錯誤),因此請明確指定。擁有它是安全的。
print(df.loc['A0', 'val_1']) # level_2 ?level_3 # B0 ? ? ? C0 ? ? ? ? 98 # ? ? ? ? ?C1 ? ? ? ? 44 # B1 ? ? ? C2 ? ? ? ? 39 # ? ? ? ? ?C3 ? ? ? ? 75 # Name: val_1, dtype: int64 print(df.loc['A0', :]) # ? ? ? ? ? ? ? ? ?val_1 ?val_2 # level_2 level_3 ? ? ? ? ? ? ? # B0 ? ? ?C0 ? ? ? ? ?98 ? ? 90 # ? ? ? ? C1 ? ? ? ? ?44 ? ? ?9 # B1 ? ? ?C2 ? ? ? ? ?39 ? ? 17 # ? ? ? ? C3 ? ? ? ? ?75 ? ? 71 print(df.loc['A0']) # ? ? ? ? ? ? ? ? ?val_1 ?val_2 # level_2 level_3 ? ? ? ? ? ? ? # B0 ? ? ?C0 ? ? ? ? ?98 ? ? 90 # ? ? ? ? C1 ? ? ? ? ?44 ? ? ?9 # B1 ? ? ?C2 ? ? ? ? ?39 ? ? 17 # ? ? ? ? C3 ? ? ? ? ?75 ? ? 71
也可以通過切片或列表選擇范圍。
print(df.loc['A0':'A2', :]) # ? ? ? ? ? ? ? ? ? ? ? ? ?val_1 ?val_2 # level_1 level_2 level_3 ? ? ? ? ? ? ? # A0 ? ? ?B0 ? ? ?C0 ? ? ? ? ?98 ? ? 90 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?44 ? ? ?9 # ? ? ? ? B1 ? ? ?C2 ? ? ? ? ?39 ? ? 17 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?75 ? ? 71 # A1 ? ? ?B2 ? ? ?C0 ? ? ? ? ? 1 ? ? 89 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?54 ? ? 60 # ? ? ? ? B3 ? ? ?C2 ? ? ? ? ?47 ? ? ?6 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?16 ? ? ?5 # A2 ? ? ?B0 ? ? ?C0 ? ? ? ? ?75 ? ? 22 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?19 ? ? ?4 # ? ? ? ? B1 ? ? ?C2 ? ? ? ? ?25 ? ? 52 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?57 ? ? 40 print(df.loc[['A0', 'A2'], :]) # ? ? ? ? ? ? ? ? ? ? ? ? ?val_1 ?val_2 # level_1 level_2 level_3 ? ? ? ? ? ? ? # A0 ? ? ?B0 ? ? ?C0 ? ? ? ? ?98 ? ? 90 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?44 ? ? ?9 # ? ? ? ? B1 ? ? ?C2 ? ? ? ? ?39 ? ? 17 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?75 ? ? 71 # A2 ? ? ?B0 ? ? ?C0 ? ? ? ? ?75 ? ? 22 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?19 ? ? ?4 # ? ? ? ? B1 ? ? ?C2 ? ? ? ? ?25 ? ? 52 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?57 ? ? 40
還可以通過從上層(外層)按順序指定值來縮小范圍。按元組順序指定值。
print(df.loc[('A0', 'B1'), :]) # ? ? ? ? ?val_1 ?val_2 # level_3 ? ? ? ? ? ? ? # C2 ? ? ? ? ?39 ? ? 17 # C3 ? ? ? ? ?75 ? ? 71 print(df.loc[('A0', 'B1', 'C2'), :]) # val_1 ? ?39 # val_2 ? ?17 # Name: (A0, B1, C2), dtype: int64
如果按順序指定元組,則列表將起作用,但切片將失敗。
print(df.loc[(['A0', 'A1'], ['B0', 'B3']), :]) # ? ? ? ? ? ? ? ? ? ? ? ? ?val_1 ?val_2 # level_1 level_2 level_3 ? ? ? ? ? ? ? # A0 ? ? ?B0 ? ? ?C0 ? ? ? ? ?98 ? ? 90 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?44 ? ? ?9 # A1 ? ? ?B3 ? ? ?C2 ? ? ? ? ?47 ? ? ?6 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?16 ? ? ?5 # print(df.loc[(:, 'B1'), :]) # SyntaxError: invalid syntax # print(df.loc[('A1':'A3', 'B2'), :]) # SyntaxError: invalid syntax
特殊切片規(guī)范:slice(),pd.IndexSlice []
當(dāng)從具有多索引的上層(外層)開始按順序指定元組的值時,將slice()用于切片。
可以使用slice(start,stop,step)創(chuàng)建slice start:stop:step。stop和step可以省略。整個切片:slice(None)。
print(df.loc[(slice(None), 'B1'), :]) # ? ? ? ? ? ? ? ? ? ? ? ? ?val_1 ?val_2 # level_1 level_2 level_3 ? ? ? ? ? ? ? # A0 ? ? ?B1 ? ? ?C2 ? ? ? ? ?39 ? ? 17 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?75 ? ? 71 # A2 ? ? ?B1 ? ? ?C2 ? ? ? ? ?25 ? ? 52 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?57 ? ? 40 print(df.loc[(slice('A1', 'A3'), 'B2'), :]) # ? ? ? ? ? ? ? ? ? ? ? ? ?val_1 ?val_2 # level_1 level_2 level_3 ? ? ? ? ? ? ? # A1 ? ? ?B2 ? ? ?C0 ? ? ? ? ? 1 ? ? 89 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?54 ? ? 60 # A3 ? ? ?B2 ? ? ?C0 ? ? ? ? ?64 ? ? 54 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?27 ? ? 96 print(df.loc[(slice('A1', 'A3'), ['B0', 'B2'], 'C1'), :]) # ? ? ? ? ? ? ? ? ? ? ? ? ?val_1 ?val_2 # level_1 level_2 level_3 ? ? ? ? ? ? ? # A1 ? ? ?B2 ? ? ?C1 ? ? ? ? ?54 ? ? 60 # A2 ? ? ?B0 ? ? ?C1 ? ? ? ? ?19 ? ? ?4 # A3 ? ? ?B2 ? ? ?C1 ? ? ? ? ?27 ? ? 96
如果使用pd.IndexSlice [],則可以指定為:。如果使用許多切片,這會更容易。
print(df.loc[pd.IndexSlice[:, 'B1'], :]) # ? ? ? ? ? ? ? ? ? ? ? ? ?val_1 ?val_2 # level_1 level_2 level_3 ? ? ? ? ? ? ? # A0 ? ? ?B1 ? ? ?C2 ? ? ? ? ?39 ? ? 17 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?75 ? ? 71 # A2 ? ? ?B1 ? ? ?C2 ? ? ? ? ?25 ? ? 52 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?57 ? ? 40 print(df.loc[pd.IndexSlice['A1':'A3', 'B2'], :]) # ? ? ? ? ? ? ? ? ? ? ? ? ?val_1 ?val_2 # level_1 level_2 level_3 ? ? ? ? ? ? ? # A1 ? ? ?B2 ? ? ?C0 ? ? ? ? ? 1 ? ? 89 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?54 ? ? 60 # A3 ? ? ?B2 ? ? ?C0 ? ? ? ? ?64 ? ? 54 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?27 ? ? 96 print(df.loc[pd.IndexSlice['A1':'A3', ['B0', 'B2'], 'C1'], :]) # ? ? ? ? ? ? ? ? ? ? ? ? ?val_1 ?val_2 # level_1 level_2 level_3 ? ? ? ? ? ? ? # A1 ? ? ?B2 ? ? ?C1 ? ? ? ? ?54 ? ? 60 # A2 ? ? ?B0 ? ? ?C1 ? ? ? ? ?19 ? ? ?4 # A3 ? ? ?B2 ? ? ?C1 ? ? ? ? ?27 ? ? 96
xs方法
還可以通過使用xs()方法指定索引列名稱(參數(shù)level)及其值(第一個參數(shù)key)來選擇和提取,多索引columns的參數(shù)axis= 1。
print(df.xs('B1', level='level_2')) # val_1 val_2 # level_1 level_3 # A0 C2 39 17 # C3 75 71 # A2 C2 25 52 # C3 57 40
也可以使用代表層次結(jié)構(gòu)級別的數(shù)值而不是索引列名稱來指定。頂層(最外層)為0。
print(df.xs('C1', level=2)) # val_1 val_2 # level_1 level_2 # A0 B0 44 9 # A1 B2 54 60 # A2 B0 19 4 # A3 B2 27 96
還可以為多個索引指定值列表。
print(df.xs(['B1', 'C2'], level=['level_2', 'level_3'])) # val_1 val_2 # level_1 # A0 39 17 # A2 25 52
要在xs()方法中指定切片,需要使用slice()或pd.IndexSlice []。
print(df.xs(pd.IndexSlice['A1':'A3'], level='level_1')) # ? ? ? ? ? ? ? ? ?val_1 ?val_2 # level_2 level_3 ? ? ? ? ? ? ? # B2 ? ? ?C0 ? ? ? ? ? 1 ? ? 89 # ? ? ? ? C1 ? ? ? ? ?54 ? ? 60 # B3 ? ? ?C2 ? ? ? ? ?47 ? ? ?6 # ? ? ? ? C3 ? ? ? ? ?16 ? ? ?5 # B0 ? ? ?C0 ? ? ? ? ?75 ? ? 22 # ? ? ? ? C1 ? ? ? ? ?19 ? ? ?4 # B1 ? ? ?C2 ? ? ? ? ?25 ? ? 52 # ? ? ? ? C3 ? ? ? ? ?57 ? ? 40 # B2 ? ? ?C0 ? ? ? ? ?64 ? ? 54 # ? ? ? ? C1 ? ? ? ? ?27 ? ? 96 # B3 ? ? ?C2 ? ? ? ? 100 ? ? 77 # ? ? ? ? C3 ? ? ? ? ?22 ? ? 50 print(df.xs(slice('A1', 'A3'), level='level_1')) # ? ? ? ? ? ? ? ? ?val_1 ?val_2 # level_2 level_3 ? ? ? ? ? ? ? # B2 ? ? ?C0 ? ? ? ? ? 1 ? ? 89 # ? ? ? ? C1 ? ? ? ? ?54 ? ? 60 # B3 ? ? ?C2 ? ? ? ? ?47 ? ? ?6 # ? ? ? ? C3 ? ? ? ? ?16 ? ? ?5 # B0 ? ? ?C0 ? ? ? ? ?75 ? ? 22 # ? ? ? ? C1 ? ? ? ? ?19 ? ? ?4 # B1 ? ? ?C2 ? ? ? ? ?25 ? ? 52 # ? ? ? ? C3 ? ? ? ? ?57 ? ? 40 # B2 ? ? ?C0 ? ? ? ? ?64 ? ? 54 # ? ? ? ? C1 ? ? ? ? ?27 ? ? 96 # B3 ? ? ?C2 ? ? ? ? 100 ? ? 77 # ? ? ? ? C3 ? ? ? ? ?22 ? ? 50
xs()方法無法在列表中指定多個值。如果要在列表中指定多個值,請使用loc []。
# print(df.xs(['B1', 'B2'], level='level_2')) # KeyError: ('B1', 'B2') print(df.loc[pd.IndexSlice[:, ['B1', 'B2']], :]) # ? ? ? ? ? ? ? ? ? ? ? ? ?val_1 ?val_2 # level_1 level_2 level_3 ? ? ? ? ? ? ? # A0 ? ? ?B1 ? ? ?C2 ? ? ? ? ?39 ? ? 17 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?75 ? ? 71 # A1 ? ? ?B2 ? ? ?C0 ? ? ? ? ? 1 ? ? 89 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?54 ? ? 60 # A2 ? ? ?B1 ? ? ?C2 ? ? ? ? ?25 ? ? 52 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?57 ? ? 40 # A3 ? ? ?B2 ? ? ?C0 ? ? ? ? ?64 ? ? 54 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?27 ? ? 96
給選擇賦值
使用loc選擇時,可以為選擇范圍分配一個值。
df.loc[(['A0', 'A1'], ['B0', 'B3']), :] = -100 print(df) # ? ? ? ? ? ? ? ? ? ? ? ? ?val_1 ?val_2 # level_1 level_2 level_3 ? ? ? ? ? ? ? # A0 ? ? ?B0 ? ? ?C0 ? ? ? ?-100 ? -100 # ? ? ? ? ? ? ? ? C1 ? ? ? ?-100 ? -100 # ? ? ? ? B1 ? ? ?C2 ? ? ? ? ?39 ? ? 17 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?75 ? ? 71 # A1 ? ? ?B2 ? ? ?C0 ? ? ? ? ? 1 ? ? 89 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?54 ? ? 60 # ? ? ? ? B3 ? ? ?C2 ? ? ? ?-100 ? -100 # ? ? ? ? ? ? ? ? C3 ? ? ? ?-100 ? -100 # A2 ? ? ?B0 ? ? ?C0 ? ? ? ? ?75 ? ? 22 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?19 ? ? ?4 # ? ? ? ? B1 ? ? ?C2 ? ? ? ? ?25 ? ? 52 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?57 ? ? 40 # A3 ? ? ?B2 ? ? ?C0 ? ? ? ? ?64 ? ? 54 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?27 ? ? 96 # ? ? ? ? B3 ? ? ?C2 ? ? ? ? 100 ? ? 77 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?22 ? ? 50 df.loc[(['A0', 'A1'], ['B0', 'B3']), :] = [-200, -300] print(df) # ? ? ? ? ? ? ? ? ? ? ? ? ?val_1 ?val_2 # level_1 level_2 level_3 ? ? ? ? ? ? ? # A0 ? ? ?B0 ? ? ?C0 ? ? ? ?-200 ? -300 # ? ? ? ? ? ? ? ? C1 ? ? ? ?-200 ? -300 # ? ? ? ? B1 ? ? ?C2 ? ? ? ? ?39 ? ? 17 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?75 ? ? 71 # A1 ? ? ?B2 ? ? ?C0 ? ? ? ? ? 1 ? ? 89 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?54 ? ? 60 # ? ? ? ? B3 ? ? ?C2 ? ? ? ?-200 ? -300 # ? ? ? ? ? ? ? ? C3 ? ? ? ?-200 ? -300 # A2 ? ? ?B0 ? ? ?C0 ? ? ? ? ?75 ? ? 22 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?19 ? ? ?4 # ? ? ? ? B1 ? ? ?C2 ? ? ? ? ?25 ? ? 52 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?57 ? ? 40 # A3 ? ? ?B2 ? ? ?C0 ? ? ? ? ?64 ? ? 54 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?27 ? ? 96 # ? ? ? ? B3 ? ? ?C2 ? ? ? ? 100 ? ? 77 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?22 ? ? 50 df.loc[(['A0', 'A1'], ['B0', 'B3']), :] = [[-1, -2], [-3, -4], [-5, -6], [-7, -8]] print(df) # ? ? ? ? ? ? ? ? ? ? ? ? ?val_1 ?val_2 # level_1 level_2 level_3 ? ? ? ? ? ? ? # A0 ? ? ?B0 ? ? ?C0 ? ? ? ? ?-1 ? ? -2 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?-3 ? ? -4 # ? ? ? ? B1 ? ? ?C2 ? ? ? ? ?39 ? ? 17 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?75 ? ? 71 # A1 ? ? ?B2 ? ? ?C0 ? ? ? ? ? 1 ? ? 89 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?54 ? ? 60 # ? ? ? ? B3 ? ? ?C2 ? ? ? ? ?-5 ? ? -6 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?-7 ? ? -8 # A2 ? ? ?B0 ? ? ?C0 ? ? ? ? ?75 ? ? 22 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?19 ? ? ?4 # ? ? ? ? B1 ? ? ?C2 ? ? ? ? ?25 ? ? 52 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?57 ? ? 40 # A3 ? ? ?B2 ? ? ?C0 ? ? ? ? ?64 ? ? 54 # ? ? ? ? ? ? ? ? C1 ? ? ? ? ?27 ? ? 96 # ? ? ? ? B3 ? ? ?C2 ? ? ? ? 100 ? ? 77 # ? ? ? ? ? ? ? ? C3 ? ? ? ? ?22 ? ? 50
xs()僅獲取該值,而無法分配它。
# df.xs(['B1', 'C2'], level=['level_2', 'level_3']) = 0 # SyntaxError: can't assign to function call
到此這篇關(guān)于Pandas中MultiIndex選擇并提取任何行和列的文章就介紹到這了,更多相關(guān)Pandas MultiIndex提取行列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python?mxnet包成功安裝詳細(xì)指南(避免踩坑+報錯)
這篇文章主要給大家介紹了關(guān)于Python?mxnet包成功安裝的相關(guān)資料,包括創(chuàng)建Python環(huán)境、激活環(huán)境、安裝MXNet及其依賴項,以及在PythonCharm中配置Python解釋器,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12pytorch 實現(xiàn)在測試的時候啟用dropout
這篇文章主要介紹了pytorch 實現(xiàn)在測試的時候啟用dropout的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05node.js獲取參數(shù)的常用方法(總結(jié))
下面小編就為大家?guī)硪黄猲ode.js獲取參數(shù)的常用方法(總結(jié))。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05Python利用xlrd?與?xlwt?模塊操作?Excel
這篇文章主要介紹了Python利用xlrd?與?xlwt?模塊操作?Excel,文章圍繞主題展開詳細(xì)的內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考一下2022-05-05