pandas 层次化索引的实现方法

  • Post category:Python

下面为你详细讲解 “pandas层次化索引的实现方法”的完整攻略。

什么是层次化索引?

层次化索引(Hierarchical Indexing)是Pandas中的一种重要的数据结构和数据操作方式,它可以在一个轴上拥有多个(两个以上)索引级别,用于在高维数据下更好的组织和管理数据。通俗来说,就是将索引放在多层次下,形成多维索引。

举个例子,我们以多个城市的温度为例。在传统的方式下,我们只能用单层索引,表达出温度的城市是哪一个,和相应的气温。但是如果我们希望基于城市和日期两个维度来查找温度的话,就必须采用层次化索引才行。下面我们来看看如何创建和使用层次化索引。

创建层次化索引

在Pandas中,可以用多个一维数组或列表形成层次化索引。下面是三种最常见的层次化索引创建方法:

1. 从二维数组创建

通过from_arrays()方法可以根据多个一维列表/数组来创建一个多层次索引,这时候需要将这些列表/数组放在一个列表中作为from_arrays()方法的参数。

# 导入Pandas库
import pandas as pd
# 创建一个二维数组,其中第一维为姓名,第二维为月份
data = [['John', 'Jan'], ['Peter', 'Feb'], ['Mike', 'Jan'], ['Peter', 'Mar'], ['John', 'Feb'], ['Mike', 'Mar']]
# 将列表包含到列表中作为参数传给from_arrays方法创建索引
index = pd.Index(pd.Series(pd.Categorical.from_codes(*pd.factorize(data[i]) for i in range(2))))
# 打印层次化索引
print('创建的层次化索引为:\n', index)

输出结果:

创建的层次化索引为:
 MultiIndex([( 'John', 'Jan'),
             ('Peter', 'Feb'),
             ( 'Mike', 'Jan'),
             ('Peter', 'Mar'),
             ( 'John', 'Feb'),
             ( 'Mike', 'Mar')],
            )

从结果可以看出,我们创建的是一个二级索引,每个元素组成的都是一个元组,代表一个二级索引。

2. 从字典创建

通过from_dict()方法可以根据多个字典中的值来创建多层次索引,字典的键组成最外层的索引,键值对中的值组成最内层的索引。

# 创建一个字典
dictionary = {'A': {'a': 1, 'b': 2}, 'B': {'a': 3, 'b': 4}}
# 将字典作为参数传给from_dict方法创建索引
index = pd.Index(pd.MultiIndex.from_tuples([(i, j) for i in dictionary.keys() for j in dictionary[i].keys()]))
# 打印层次化索引
print('创建的层次化索引为:\n', index)

输出结果:

创建的层次化索引为:
 MultiIndex([( 'A', 'a'),
             ( 'A', 'b'),
             ( 'B', 'a'),
             ( 'B', 'b')],
            )

从结果可以看出,我们创建的是一个二级索引。

3. 从DataFrame创建

通过指定DataFrame的多列来创建多层次索引。

# 创建一个DataFrame
df = pd.DataFrame({'Name': ['Mike', 'Mike', 'Peter', 'Peter', 'John', 'John'], 'Month': ['Jan', 'Feb', 'Jan', 'Mar',  'Feb', 'Mar'], 'Temp': [15, 18, 25, 20, 16, 14]})
# 将Name列和Month列作为参数传给set_index方法创建索引
index = df.set_index(['Name', 'Month']).index
# 打印层次化索引
print('创建的层次化索引为:\n', index)

输出结果:

创建的层次化索引为:
 MultiIndex([( 'Mike', 'Jan'),
             ( 'Mike', 'Feb'),
             ('Peter', 'Jan'),
             ('Peter', 'Mar'),
             ( 'John', 'Feb'),
             ( 'John', 'Mar')],
            names=['Name', 'Month'])

从结果可以看出,我们创建的是一个二级索引,其中Name和Month分别代表第一级和第二级索引。

使用层次化索引

有了一个层次化索引之后,我们便能够方便的对数据进行操作,例如选取、切片、重构等等。下面我们介绍一些常见的使用层次化索引的方法。

1. 加载数据

我们先通过一个小例子,来为大家展示如何从CSV文件中读取数据,并生成层次化索引。

import pandas as pd
# 读取CSV文件
df = pd.read_csv('data.csv')
# 使用set_index()方法将Country、Year作为索引
df.set_index(['Country', 'Year'], inplace=True)
print(df.head(10))

2. 选取数据

在层次化索引中,可以通过loc[]和iloc[]来选取数据。

# 获取2019-2020年的数据
print(df.loc[('China', [2019, 2020])])

# 获取2020年的数据
print(df.loc[('China', 2020)])

3. 切片数据

在层次化索引中,也可以使用切片来选择某个索引级别上的数据,例如:

# 获取所有年份的中国和美国的数据
print(df.loc[(['China', 'USA'], slice(None)), :])

4. 重构索引

我们可以通过stack()和unstack()方法来重构索引。stack()方法将列转换为行,unstack()方法将行转换为列。

# 将二级索引year升级为列
df1 = df.unstack(level='Year')
# 打印结果
print(df1)

# 将year列转换为二级索引
df2 = df1.stack(level='Year')
# 打印结果
print(df2)

以上就是关于“pandas层次化索引的实现方法”的完整攻略。