Pandas MultiIndex

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** 重复了四次。

此外,我们以随机顺序排列了条目,并使用整数作为行的索引,从而使查找特定国家的数据的任务复杂化。随着数据集大小的增长,此任务会变得繁琐。

在这种情况下,如图所示的分层索引更有意义。

Hierarchical index with parent/child relationship between the Continent and Country columns
分层索引

在此,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

在此示例中,我们从两个数组:continentcountry 创建了一个名为 multi_indexMultiIndex 对象。

然后,我们使用 population 数组创建了一个 DataFrame,并将 multi_index 分配给它作为索引。

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战