Pandas 中的 MultiIndex 是一种分层索引结构,可让我们高效地表示和处理更高维度的数据。
虽然典型索引指向单个列,但 MultiIndex 包含多个索引级别。MultiIndex 中的每个列都通过父/子关系相互连接。
让我们以包含不同国家人口的 DataFrame 为例。
import pandas as pd
# create a dictionary
data = {
"Continent": ["North America", "Europe", "Asia", "North America", "Asia", "Europe", "North America", "Asia", "Europe", "Asia"],
"Country": ["United States", "Germany", "China", "Canada", "Japan", "France", "Mexico", "India", "United Kingdom", "Nepal"],
"Population": [331002651, 83783942, 1439323776, 37742154, 126476461, 65273511, 128932753, 1380004385, 67886011, 29136808]
}
# create dataframe from dictionary
df = pd.DataFrame(data)
print(df)
输出
Continent Country Population 0 North America United States 331002651 1 Europe Germany 83783942 2 Asia China 1439323776 3 North America Canada 37742154 4 Asia Japan 126476461 5 Europe France 65273511 6 North America Mexico 128932753 7 Asia India 1380004385 8 Europe United Kingdom 67886011 9 Asia Nepal 29136808
请注意 Continent
列中的重复项。**North America** 和 **Europe** 各重复了三次,而 **Asia** 重复了四次。
此外,我们以随机顺序排列了条目,并使用整数作为行的索引,从而使查找特定国家的数据的任务复杂化。随着数据集大小的增长,此任务会变得繁琐。
在这种情况下,如图所示的分层索引更有意义。

在此,Continent
是父列,Country
是子列。
在 Pandas 中创建 MultiIndex
在 Pandas 中,我们使用 **MultiIndex** 的概念来实现分层索引。
让我们看一个例子。
import pandas as pd
# create a dictionary
data = {
"Continent": ["North America", "Europe", "Asia", "North America", "Asia", "Europe", "North America", "Asia", "Europe", "Asia"],
"Country": ["United States", "Germany", "China", "Canada", "Japan", "France", "Mexico", "India", "United Kingdom", "Nepal"],
"Population": [331002651, 83783942, 1439323776, 37742154, 126476461, 65273511, 128932753, 1380004385, 67886011, 29136808]
}
# create dataframe from dictionary
df = pd.DataFrame(data)
# sort the data by continent
df.sort_values('Continent', inplace=True)
# create a multiindex
df.set_index(['Continent','Country'], inplace=True)
print(df)
输出
Population Continent Country Asia China 1439323776 Japan 126476461 India 1380004385 Nepal 29136808 Europe Germany 83783942 France 65273511 United Kingdom 67886011 North America United States 331002651 Canada 37742154 Mexico 128932753
在上面的示例中,我们首先根据 Continent
列对 DataFrame df 中的值进行了排序。这会将同一大洲的条目分组在一起。
然后,我们将一个列列表作为参数传递给 set_index()
函数,从而创建了一个 MultiIndex。
请注意列表中列的顺序。Continent
在前,因为它是一个父列,而 Country
在后,因为它属于 Continent
。
使用 MultiIndex 访问行
我们可以使用以下示例所示的方法使用 MultiIndex 访问行。
import pandas as pd
# create a dictionary
data = {
"Continent": ["North America", "Europe", "Asia", "North America", "Asia", "Europe", "North America", "Asia", "Europe", "Asia"],
"Country": ["United States", "Germany", "China", "Canada", "Japan", "France", "Mexico", "India", "United Kingdom", "Nepal"],
"Population": [331002651, 83783942, 1439323776, 37742154, 126476461, 65273511, 128932753, 1380004385, 67886011, 29136808]
}
# create dataframe from dictionary
df = pd.DataFrame(data)
# sort the data by continent
df.sort_values('Continent', inplace=True)
# create a multiindex
df.set_index(['Continent','Country'], inplace=True)
# access all entries under Asia
asia = df.loc['Asia']
# access Canada
canada = df.loc[('North America', 'Canada')]
print('Asia\n', asia)
print('\nCanada\n', canada)
输出
Asia Population Country China 1439323776 Japan 126476461 India 1380004385 Nepal 29136808 Canada Population 37742154 Name: (North America, Canada), dtype: int64
在上面的示例中,我们通过将单个字符串 **Asia** 传递给 df.loc[]
来访问 Asia
下的所有条目。
要访问特定行 Canada
,我们将一个元组 ('North America' , 'Canada')
传递给 df.loc[]
。
注意:我们需要以元组的形式提供完整的层级索引才能访问特定行。
仅提供子列的标签将导致错误。
# correct
df.loc[('North America' , 'Canada')]
# error
df.loc['Canada']
来自数组的 MultiIndex
我们还可以使用 from_arrays()
方法从数组的数组创建 MultiIndex。
让我们看一个例子。
import pandas as pd
# create arrays
continent = ['Asia', 'Asia', 'Asia', 'Asia', 'Europe', 'Europe', 'Europe', 'North America', 'North America', 'North America']
country = ['China', 'India', 'Japan', 'Nepal', 'France', 'Germany', 'United Kingdom', 'Canada', 'Mexico', 'United States']
population = [1439323776, 1380004385, 126476461, 29136808, 65273511, 83783942, 67886011, 37742154, 128932753, 331002651]
# create array of arrays
index_array = [continent, country]
# create multiindex from array
multi_index = pd.MultiIndex.from_arrays(index_array, names=['Continent', 'Country'])
# create dataframe using multiindex
df = pd.DataFrame({'Population' :population}, index=multi_index)
print(df)
输出
Population Continent Country Asia China 1439323776 India 1380004385 Japan 126476461 Nepal 29136808 Europe France 65273511 Germany 83783942 United Kingdom 67886011 North America Canada 37742154 Mexico 128932753 United States 331002651
在此示例中,我们从两个数组:continent 和 country 创建了一个名为 multi_index 的 MultiIndex
对象。
然后,我们使用 population 数组创建了一个 DataFrame,并将 multi_index 分配给它作为索引。