中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Pandas中怎么使用MultiIndex選擇并提取任何行和列

發布時間:2023-02-23 14:23:57 來源:億速云 閱讀:159 作者:iii 欄目:開發技術

這篇文章主要介紹“Pandas中怎么使用MultiIndex選擇并提取任何行和列”,在日常操作中,相信很多人在Pandas中怎么使用MultiIndex選擇并提取任何行和列問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Pandas中怎么使用MultiIndex選擇并提取任何行和列”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    使用多索引(分層索引)可以方便地對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

    到此,關于“Pandas中怎么使用MultiIndex選擇并提取任何行和列”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    白城市| 礼泉县| 新丰县| 印江| 绍兴县| 平武县| 苍山县| 明水县| 通化县| 孟连| 北安市| 大同县| 广西| 平果县| 安义县| 五峰| 正安县| 十堰市| 湾仔区| 道孚县| 巴彦淖尔市| 满城县| 亳州市| 广南县| 休宁县| 上饶市| 广东省| 格尔木市| 凤阳县| 苍溪县| 红原县| 维西| 临泽县| 六枝特区| 泽普县| 个旧市| 乐都县| 邯郸县| 塔河县| 贺兰县| 荥经县|