Python Pandas – 如何在指定级别对MultiIndex进行排序

Python Pandas – 如何在指定级别对MultiIndex进行排序

什么是 MultiIndex?

在 Pandas 中,我们可以使用 MultiIndex(多重索引)来表示带有层级关系的数据集。它可以被视为一种带有多个标签的数组,在一个标签上进行查找时,我们可以得到一个子集,然后在这个子集上再进行下一级的查找。这种结构对于需要多维度分析的数据非常有用。举个例子,假设我们有一个列名为 year 和 country 的 DataFrame,其中 year 列表示年份,country 列表示国家,同时按照这两列分别进行了排序,那么我们可以将这个 DataFrame 视为一个带有两个索引的二维表格,其中每个值都用 year 和 country 来确定它的位置。

如何创建 MultiIndex?

Pandas 中创建 MultiIndex 的方法很多,这里只介绍其中几种比较常用的方式:

从数组创建 MultiIndex

我们可以直接从一个包含多个数组或元组的列表中创建 MultiIndex,其中每个数组或元组对应一个层级的索引。例如,我们创建一个三层的 MultiIndex。

import pandas as pd

index = pd.MultiIndex.from_arrays([
    ['a', 'a', 'b', 'b'],
    [1, 2, 1, 2],
    ['x', 'y', 'x', 'y']
])

df = pd.DataFrame({'value': [1, 2, 3, 4]}, index=index)
print(df)

代码输出:

       value
a 1 x      1
  2 y      2
b 1 x      3
  2 y      4

从 DataFrame 创建 MultiIndex

如果我们有一个以列名为索引的 DataFrame,我们可以使用 set_index() 方法将其转化为 MultiIndex。下面是一个例子:

import pandas as pd

df = pd.DataFrame({'year': [2010, 2011, 2012, 2013],
                   'country': ['China', 'US', 'Japan', 'Russia'],
                   'population': [1347, 309, 127, 143]},
                  columns=['year', 'country', 'population'])

df = df.set_index(['year', 'country'])
print(df)

代码输出:

              population
year country            
2010 China          1347
2011 US              309
2012 Japan           127
2013 Russia          143

从序列创建 MultiIndex

另一种常用的创建 MultiIndex 的方式是使用 from_tuples() 或 from_product()。这里以 from_tuples() 的方法举例。

import pandas as pd

index = pd.MultiIndex.from_tuples(
    [('a', 1), ('a', 2), ('b', 1), ('b', 2)],
    names=['letter', 'number']
)

df = pd.DataFrame({'value': [1, 2, 3, 4]}, index=index)
print(df)

代码输出:

              value
letter number       
a      1          1
       2          2
b      1          3
       2          4

如何在指定级别对 MultiIndex 进行排序?

了解了如何创建 MultiIndex 后,我们来看一下如何对其进行排序。通常情况下,我们会对某个索引层级上的值进行排序。为了演示这个问题,我们先创建一个三层的 MultiIndex。

import pandas as pd

index = pd.MultiIndex.from_product(
    [['b', 'a'], ['y', 'x'], ['j', 'i']],
    names=['letter', 'case', 'position']
)

df = pd.DataFrame({'value': range(8)}, index=index)
print(df)

代码输出:

                      value
letter case position       
b      y    j            0
            i            1
       x    j            2
            i            3
a      y    j            4
            i            5
       x    j            6
            i            7

现在我们分别在每个层级上进行排序。以 letter 为例,我们可以使用 sort_index() 方法,在 level 参数中指定排序的层级:

sorted_df = df.sort_index(level='letter')
print(sorted_df)

代码输出:

                      value
letter case position       
a      x    i            7
            j            6
       y    i            5
            j            4
b      x    i            3
            j            2
       y    i            1
            j            0

我们也可以同时对多个层级进行排序。例如,我们同时对 letter 和 case 两个层级进行排序:

sorted_df = df.sort_index(level=['letter', 'case'])
print(sorted_df)

代码输出:

                      value
letter case position       
a      x    i            7
            j            6
       y    i            5
            j            4
b      x    i            3
            j            2
       y    i            1
            j            0

注意,当我们对多个层级进行排序时,排序的顺序很重要。例如,上面的代码中,我们先对 letter 进行排序,再对 case 进行排序,这样得到的结果与先对 case 进行排序,再对 letter 进行排序的结果是不同的:

sorted_df = df.sort_index(level=['case', 'letter'])
print(sorted_df)

代码输出:

                      value
letter case position       
a      x    i            7
            j            6
       y    i            5
            j            4
b      x    i            3
            j            2
       y    i            1
            j            0

所以,如果我们需要对多个层级进行排序,必须注意排序的顺序,以保证得到正确的结果。

结论

在 Pandas 中,MultiIndex 可以帮助我们更好地表示多维度的数据,并且支持按照某个层级上的值进行排序。我们可以使用 sort_index() 方法对 MultiIndex 进行排序,并且可以指定排序的层级。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程