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 进行排序,并且可以指定排序的层级。