日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Pandas中MultiIndex選擇并提取任何行和列_python

作者:餃子大人 ? 更新時間: 2023-06-04 編程語言

使用多索引(分層索引)可以方便地對pandas.DataFrame和pandas.Series的索引進行分層配置,以便可以為每個層次結構計算統計信息,例如總數和平均值。

以下csv數據為例。每個索引列都命名為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'])

這里,將描述以下內容。

  • 選擇并提取帶有loc的任何行或列
    • 特殊切片規范:slice(),pd.IndexSlice []
  • xs方法
  • 給選擇賦值

選擇并提取帶有loc的任何行或列

可以像使用普通索引一樣使用loc []選擇和提取任何行/列。

Pandas獲取和修改任意位置的值(at,iat,loc,iloc)

在示例中,索引是一個多索引,但是當列是一個多索引時,同樣的想法也適用。

如果選擇上層(外層),則它與普通loc []相同。

指定整列時,可以省略back slice :,但是使用后述的slice(None)或pd.IndexSlice時,不能將其省略(這會導致錯誤),因此請明確指定。擁有它是安全的。

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

特殊切片規范:slice(),pd.IndexSlice []

當從具有多索引的上層(外層)開始按順序指定元組的值時,將slice()用于切片。

可以使用slice(start,stop,step)創建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()方法指定索引列名稱(參數level)及其值(第一個參數key)來選擇和提取,多索引columns的參數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

也可以使用代表層次結構級別的數值而不是索引列名稱來指定。頂層(最外層)為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

原文鏈接:https://blog.csdn.net/qq_18351157/article/details/107684559

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新