37_Pandas中Multiindex的指定,添加,取消,排序,级别的更改

37_Pandas中Multiindex的指定,添加,取消,排序,级别的更改

在Pandas中设置了Multiindex(多索引,层次索引)可以更轻松地查看每个层次中每个项目的统计信息。

这里,将描述关于多索引设置的以下内容。

  • 读取文件时设置:read_csv()
  • 指定/添加数据列到多索引:set_index()
  • 取消多索引:reset_index()
  • 排序多索引:sort_index()
  • 更改多索引级别:swaplevel()
    以下面的数据为例。
import pandas as pd

df = pd.read_csv('./data/37/sample_multi.csv')
print(df)
#    level_1 level_2 level_3  val_1  val_2
# 0       A0      B0      C0     98     90
# 1       A0      B0      C1     44      9
# 2       A0      B1      C2     39     17
# 3       A0      B1      C3     75     71
# 4       A1      B2      C0      1     89
# 5       A1      B2      C1     54     60
# 6       A1      B3      C2     47      6
# 7       A1      B3      C3     16      5
# 8       A2      B0      C0     75     22
# 9       A2      B0      C1     19      4
# 10      A2      B1      C2     25     52
# 11      A2      B1      C3     57     40
# 12      A3      B2      C0     64     54
# 13      A3      B2      C1     27     96
# 14      A3      B3      C2    100     77
# 15      A3      B3      C3     22     50

读取文件时设置:read_csv()

如果要从文件读取数据,则可以在读取时设置多索引。 在read_csv()方法中,如果在列表中的参数index_col中指定列名或列号,则它将成为多索引。

df_m_csv = pd.read_csv('./data/37/sample_multi.csv', index_col=['level_1', 'level_2', 'level_3'])
print(df_m_csv)
#                          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

有关read_csv()方法的详细信息,请参阅以下文章。

指定/添加数据列到多索引:set_index()

使用set_index()方法可将现有pandas.DataFrame对象中的多个数据列指定为多索引。 在第一个参数键中指定列名称的列表。

df_m = df.set_index(['level_1', 'level_2', 'level_3'])
print(df_m)
#                          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

在将数据列作为多索引添加到已建立索引的pandas.DataFrame对象时,也会使用Set_index()。

当参数append为True时添加。请注意,默认值为append = False,它将被新索引覆盖。

df_m_1 = df.set_index('level_1')
print(df_m_1)
#         level_2 level_3  val_1  val_2
# level_1                              
# A0           B0      C0     98     90
# A0           B0      C1     44      9
# A0           B1      C2     39     17
# A0           B1      C3     75     71
# A1           B2      C0      1     89
# A1           B2      C1     54     60
# A1           B3      C2     47      6
# A1           B3      C3     16      5
# A2           B0      C0     75     22
# A2           B0      C1     19      4
# A2           B1      C2     25     52
# A2           B1      C3     57     40
# A3           B2      C0     64     54
# A3           B2      C1     27     96
# A3           B3      C2    100     77
# A3           B3      C3     22     50

df_m_2 = df_m_1.set_index('level_2', append=True)
print(df_m_2)
#                 level_3  val_1  val_2
# level_1 level_2                      
# A0      B0           C0     98     90
#         B0           C1     44      9
#         B1           C2     39     17
#         B1           C3     75     71
# A1      B2           C0      1     89
#         B2           C1     54     60
#         B3           C2     47      6
#         B3           C3     16      5
# A2      B0           C0     75     22
#         B0           C1     19      4
#         B1           C2     25     52
#         B1           C3     57     40
# A3      B2           C0     64     54
#         B2           C1     27     96
#         B3           C2    100     77
#         B3           C3     22     50

在此示例中,返回了一个新对象,但是如果set_index()的参数位置为True,则将更改名为set_index()的对象。 另请参阅以下有关set_index()的文章。

取消多索引:reset_index()

使用reset_index()方法可取消多索引。 如果未指定任何参数,则将释放所有索引列并将其添加到数据列。

df_r_all = df_m.reset_index()
print(df_r_all)
#    level_1 level_2 level_3  val_1  val_2
# 0       A0      B0      C0     98     90
# 1       A0      B0      C1     44      9
# 2       A0      B1      C2     39     17
# 3       A0      B1      C3     75     71
# 4       A1      B2      C0      1     89
# 5       A1      B2      C1     54     60
# 6       A1      B3      C2     47      6
# 7       A1      B3      C3     16      5
# 8       A2      B0      C0     75     22
# 9       A2      B0      C1     19      4
# 10      A2      B1      C2     25     52
# 11      A2      B1      C3     57     40
# 12      A3      B2      C0     64     54
# 13      A3      B2      C1     27     96
# 14      A3      B3      C2    100     77
# 15      A3      B3      C3     22     50

如果只想从多索引中释放特定的索引列,请在参数级别将列名称指定为字符串,或者将级别(层次结构)指定为整数值。外部(主要项目)的级别(层次结构)为0。 在列名或级别值的列表中指定时,将释放多个索引列。

df_r_1 = df_m.reset_index(level='level_1')
print(df_r_1)
#                 level_1  val_1  val_2
# level_2 level_3                      
# B0      C0           A0     98     90
#         C1           A0     44      9
# B1      C2           A0     39     17
#         C3           A0     75     71
# B2      C0           A1      1     89
#         C1           A1     54     60
# B3      C2           A1     47      6
#         C3           A1     16      5
# B0      C0           A2     75     22
#         C1           A2     19      4
# B1      C2           A2     25     52
#         C3           A2     57     40
# B2      C0           A3     64     54
#         C1           A3     27     96
# B3      C2           A3    100     77
#         C3           A3     22     50

df_r_1 = df_m.reset_index(level=0)
print(df_r_1)
#                 level_1  val_1  val_2
# level_2 level_3                      
# B0      C0           A0     98     90
#         C1           A0     44      9
# B1      C2           A0     39     17
#         C3           A0     75     71
# B2      C0           A1      1     89
#         C1           A1     54     60
# B3      C2           A1     47      6
#         C3           A1     16      5
# B0      C0           A2     75     22
#         C1           A2     19      4
# B1      C2           A2     25     52
#         C3           A2     57     40
# B2      C0           A3     64     54
#         C1           A3     27     96
# B3      C2           A3    100     77
#         C3           A3     22     50

df_r_2 = df_m.reset_index(level=['level_1', 'level_2'])
print(df_r_2)
#         level_1 level_2  val_1  val_2
# level_3                              
# C0           A0      B0     98     90
# C1           A0      B0     44      9
# C2           A0      B1     39     17
# C3           A0      B1     75     71
# C0           A1      B2      1     89
# C1           A1      B2     54     60
# C2           A1      B3     47      6
# C3           A1      B3     16      5
# C0           A2      B0     75     22
# C1           A2      B0     19      4
# C2           A2      B1     25     52
# C3           A2      B1     57     40
# C0           A3      B2     64     54
# C1           A3      B2     27     96
# C2           A3      B3    100     77
# C3           A3      B3     22     50

如果要从多索引中释放并将其从数据列中删除,请将参数drop设置为True。

df_r_drop = df_m.reset_index(level='level_1', drop=True)
print(df_r_drop)
#                  val_1  val_2
# level_2 level_3              
# B0      C0          98     90
#         C1          44      9
# B1      C2          39     17
#         C3          75     71
# 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

在该示例中,返回了一个新对象,但是如果reset_index()也将参数place设置为True,则名为reset_index()的对象将更改。 另请参见以下有关reset_index()的文章。

排序多索引:sort_index()

使用sort_index()对多索引索引列进行排序。 如果像上面的示例那样释放索引列,则更容易查看是否再次对其进行排序。 如果未指定任何参数,则将按级别顺序对其进行排序。

df_r_drop_sort = df_r_drop.sort_index()
print(df_r_drop_sort)
#                  val_1  val_2
# level_2 level_3              
# B0      C0          98     90
#         C0          75     22
#         C1          44      9
#         C1          19      4
# B1      C2          39     17
#         C2          25     52
#         C3          75     71
#         C3          57     40
# B2      C0           1     89
#         C0          64     54
#         C1          54     60
#         C1          27     96
# B3      C2          47      6
#         C2         100     77
#         C3          16      5
#         C3          22     50

如果要按特定的索引列排序,请在参数级别中指定列名称或级别值或它们的列表。

df_r_drop_sort_2 = df_r_drop.sort_index(level='level_3')
print(df_r_drop_sort_2)
#                  val_1  val_2
# level_2 level_3              
# B0      C0          98     90
#         C0          75     22
# B2      C0           1     89
#         C0          64     54
# B0      C1          44      9
#         C1          19      4
# B2      C1          54     60
#         C1          27     96
# B1      C2          39     17
#         C2          25     52
# B3      C2          47      6
#         C2         100     77
# B1      C3          75     71
#         C3          57     40
# B3      C3          16      5
#         C3          22     50

另请参见以下有关sort_index()的文章。

更改多索引级别:swaplevel()

使用swaplevel()方法更改多索引级别(层次结构)的顺序。 如果在第一个和第二个参数中指定列名或级别值,则将交换两个级别(层次结构)。

print(df_m)
#                          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

df_m_swap = df_m.swaplevel('level_1', 'level_3')
print(df_m_swap)
#                          val_1  val_2
# level_3 level_2 level_1              
# C0      B0      A0          98     90
# C1      B0      A0          44      9
# C2      B1      A0          39     17
# C3      B1      A0          75     71
# C0      B2      A1           1     89
# C1      B2      A1          54     60
# C2      B3      A1          47      6
# C3      B3      A1          16      5
# C0      B0      A2          75     22
# C1      B0      A2          19      4
# C2      B1      A2          25     52
# C3      B1      A2          57     40
# C0      B2      A3          64     54
# C1      B2      A3          27     96
# C2      B3      A3         100     77
# C3      B3      A3          22     50

df_m_swap = df_m.swaplevel(0, 2)
print(df_m_swap)
#                          val_1  val_2
# level_3 level_2 level_1              
# C0      B0      A0          98     90
# C1      B0      A0          44      9
# C2      B1      A0          39     17
# C3      B1      A0          75     71
# C0      B2      A1           1     89
# C1      B2      A1          54     60
# C2      B3      A1          47      6
# C3      B3      A1          16      5
# C0      B0      A2          75     22
# C1      B0      A2          19      4
# C2      B1      A2          25     52
# C3      B1      A2          57     40
# C0      B2      A3          64     54
# C1      B2      A3          27     96
# C2      B3      A3         100     77
# C3      B3      A3          22     50

很容易看出是否按sore_index()排序。

df_m_swap_sort = df_m.swaplevel('level_1', 'level_3').sort_index()
print(df_m_swap_sort)
#                          val_1  val_2
# level_3 level_2 level_1              
# C0      B0      A0          98     90
#                 A2          75     22
#         B2      A1           1     89
#                 A3          64     54
# C1      B0      A0          44      9
#                 A2          19      4
#         B2      A1          54     60
#                 A3          27     96
# C2      B1      A0          39     17
#                 A2          25     52
#         B3      A1          47      6
#                 A3         100     77
# C3      B1      A0          75     71
#                 A2          57     40
#         B3      A1          16      5
#                 A3          22     50

如果要以任何顺序更改级别而不是交换两个级别,请使用reset_index()取消,然后使用set_index()再次设置。

df_m_change = df_m.reset_index().set_index(['level_2', 'level_3', 'level_1']).sort_index()
print(df_m_change)
#                          val_1  val_2
# level_2 level_3 level_1              
# B0      C0      A0          98     90
#                 A2          75     22
#         C1      A0          44      9
#                 A2          19      4
# B1      C2      A0          39     17
#                 A2          25     52
#         C3      A0          75     71
#                 A2          57     40
# B2      C0      A1           1     89
#                 A3          64     54
#         C1      A1          54     60
#                 A3          27     96
# B3      C2      A1          47      6
#                 A3         100     77
#         C3      A1          16      5
#                 A3          22     50
  • 12
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值