跳到主要内容

Pandas 层次化索引

层次化索引(MultiIndex)是Pandas中一种强大的数据结构,它允许你在一个轴上拥有多个索引级别。这种索引方式特别适合处理高维数据,能够让你更灵活地组织和分析数据。

什么是层次化索引?

层次化索引,也称为多级索引,是Pandas中的一种索引结构,它允许你在一个轴上拥有多个索引级别。与普通的单级索引不同,层次化索引可以让你在数据中创建更复杂的层次结构,从而更高效地处理多维数据。

例如,假设你有一个数据集,其中包含不同城市、不同年份的销售数据。使用层次化索引,你可以将城市和年份作为索引的两个级别,从而更方便地进行数据筛选、分组和聚合操作。

创建层次化索引

在Pandas中,你可以通过多种方式创建层次化索引。最常见的方法是使用 pd.MultiIndex.from_arrayspd.MultiIndex.from_tuplespd.MultiIndex.from_product

示例1:使用 from_arrays 创建层次化索引

python
import pandas as pd

# 创建层次化索引
arrays = [
['北京', '北京', '上海', '上海'],
[2020, 2021, 2020, 2021]
]
index = pd.MultiIndex.from_arrays(arrays, names=('城市', '年份'))

# 创建DataFrame
data = [100, 150, 200, 250]
df = pd.DataFrame(data, index=index, columns=['销售额'])

print(df)

输出:

          销售额
城市 年份
北京 2020 100
2021 150
上海 2020 200
2021 250

在这个例子中,我们创建了一个包含两个索引级别(城市和年份)的层次化索引,并将其应用于一个DataFrame。

示例2:使用 from_tuples 创建层次化索引

python
# 创建层次化索引
tuples = [
('北京', 2020),
('北京', 2021),
('上海', 2020),
('上海', 2021)
]
index = pd.MultiIndex.from_tuples(tuples, names=('城市', '年份'))

# 创建DataFrame
data = [100, 150, 200, 250]
df = pd.DataFrame(data, index=index, columns=['销售额'])

print(df)

输出:

          销售额
城市 年份
北京 2020 100
2021 150
上海 2020 200
2021 250

这个例子与上一个类似,只不过我们使用了 from_tuples 方法来创建层次化索引。

操作层次化索引

一旦你创建了层次化索引,你可以通过多种方式对其进行操作。以下是一些常见的操作:

1. 选择数据

你可以使用 .loc 方法来选择特定索引级别的数据。

python
# 选择北京的数据
print(df.loc['北京'])

输出:

          销售额
年份
2020 100
2021 150

2. 交叉选择

你可以使用 .xs 方法进行交叉选择,选择特定索引级别的数据。

python
# 选择2020年的数据
print(df.xs(2020, level='年份'))

输出:

     销售额
城市
北京 100
上海 200

3. 重置索引

你可以使用 .reset_index() 方法将层次化索引转换为普通列。

python
# 重置索引
df_reset = df.reset_index()
print(df_reset)

输出:

   城市   年份  销售额
0 北京 2020 100
1 北京 2021 150
2 上海 2020 200
3 上海 2021 250

实际应用场景

层次化索引在实际应用中非常有用,尤其是在处理多维数据时。以下是一个实际应用场景:

场景:分析不同城市、不同年份的销售数据

假设你有一个包含多个城市、多个年份的销售数据集。使用层次化索引,你可以轻松地对数据进行分组、聚合和分析。

python
# 创建层次化索引
arrays = [
['北京', '北京', '上海', '上海', '广州', '广州'],
[2020, 2021, 2020, 2021, 2020, 2021]
]
index = pd.MultiIndex.from_arrays(arrays, names=('城市', '年份'))

# 创建DataFrame
data = [100, 150, 200, 250, 300, 350]
df = pd.DataFrame(data, index=index, columns=['销售额'])

# 按城市分组,计算每年的平均销售额
print(df.groupby('城市').mean())

输出:

      销售额
城市
北京 125.0
上海 225.0
广州 325.0

在这个场景中,我们使用层次化索引对数据进行分组,并计算了每个城市的平均销售额。

总结

层次化索引是Pandas中处理多维数据的强大工具。通过创建多级索引,你可以更灵活地组织和分析数据。本文介绍了如何创建层次化索引、如何操作层次化索引,并通过实际应用场景展示了层次化索引的强大功能。

附加资源与练习

  • 官方文档:阅读Pandas官方文档中关于层次化索引的部分,了解更多高级用法。
  • 练习:尝试创建一个包含三个索引级别(例如:国家、城市、年份)的层次化索引,并对其进行分组和聚合操作。
提示

如果你在练习中遇到问题,可以参考Pandas的官方文档或在线社区寻求帮助。