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