Pandas的分层索引(Hierarchical Indexing)可以让我们在一个轴上拥有多个索引级别,这样可以更加灵活方便地表示多维数据。
一、创建分层索引
在 Pandas 中创建分层索引的方式很多,最常用的方法是通过在创建DataFrame或者Series时传入元组列表。
下面以DataFrame为例,通过传入元组列表创建一个 3 x 3 的分层索引 DataFrame:
import pandas as pd
import numpy as np
data = pd.DataFrame(np.random.rand(3, 3),
index=[("A", "a"), ("A", "b"), ("B", "a")],
columns=[("X", "x1"), ("X", "x2"), ("Y", "y1")])
print(data)
输出结果:
X Y
x1 x2 y1
A a 0.782213 0.264740 0.633578
b 0.629361 0.460047 0.982339
B a 0.352546 0.210559 0.693152
我们可以看到,DataFrame 的行和列都是由元组组成的。
二、访问分层索引
在访问分层索引时,我们可以使用 loc 和 iloc 方法。loc 可以用于标签索引,iloc 用于位置索引。
- 使用 loc 方法访问分层索引
# 访问第一层索引为A,第二层索引为b的行
print(data.loc[("A", "b"), :])
# 访问第一层索引为A的所有行
print(data.loc["A", :])
# 访问第二层索引为x1的列
print(data.loc[:, ("X", "x1")])
输出结果:
X x1 0.629361
x2 0.460047
Y y1 0.982339
Name: (A, b), dtype: float64
X Y
x1 x2 y1
a 0.782213 0.264740 0.633578
b 0.629361 0.460047 0.982339
A x1 0.782213
x2 0.264740
B x1 0.352546
Name: (0, 1), dtype: float64
- 使用 iloc 方法访问分层索引
iloc 用于位置索引,我们需要使用元组将位置信息进行传递。位置的先后顺序需要按照创建时的顺序,先列后行。
# 访问第 2 行第 2 列的值
print(data.iloc[(1,1)])
# 访问第 2 列的值
print(data.iloc[:,1])
输出结果:
0.46004724440440075
A a 0.264740
b 0.460047
B a 0.210559
Name: (X, x2), dtype: float64
三、选取行列子集
在分层索引的情况下,我们需要选取行列的子集时,可以使用 loc 方法。其中的冒号用来代表所有一级列索引。
- 选取一级索引为 A 的行,二级索引为 a 和 b 的列子集。
subset1 = data.loc["A", [("X", "x1"), ("Y", "y1")]]
print(subset1)
输出结果:
X Y
x1 y1
a 0.782213 0.633578
b 0.629361 0.982339
- 选取一级索引为 A 的行,所有二级索引的列子集。
subset2 = data.loc["A", :]
print(subset2)
输出结果:
X Y
x1 x2 y1
a 0.782213 0.264740 0.633578
b 0.629361 0.460047 0.982339
- 选取一级索引为所有行,二级索引为 x1 的列子集。
subset3 = data.loc[:, pd.IndexSlice[:, "x1"]]
print(subset3)
输出结果:
X
x1
A a 0.782213
b 0.629361
B a 0.352546
四、重排分层索引
重排分层索引可以让我们更好地理解 DataFrame 的结构。我们可以针对不同的层进行不同的操作。
- 修改索引的级别名称
print(data)
# 修改第一级索引名称
data.index.names = ["一级索引", "二级索引"]
# 修改第二级索引名称
data.columns.names = ["列1", "列2"]
print(data)
输出结果:
列1 X Y
列2 x1 x2 y1
一级索引 二级索引
A a 0.782213 0.264740 0.633578
b 0.629361 0.460047 0.982339
B a 0.352546 0.210559 0.693152
列1 X Y
列2 x1 x2 y1
一级索引 二级索引
A a 0.782213 0.264740 0.633578
b 0.629361 0.460047 0.982339
B a 0.352546 0.210559 0.693152
- 交换两层索引
data_swap = data.swaplevel("一级索引", "二级索引", axis=0)
print(data_swap)
输出结果:
列1 X Y
列2 x1 x2 y1
二级索引 一级索引
a A 0.782213 0.264740 0.633578
b A 0.629361 0.460047 0.982339
a B 0.352546 0.210559 0.693152
- 按某层索引排序
data_sort = data.sort_index(level="二级索引", axis=0)
print(data_sort)
输出结果:
列1 X Y
列2 x1 x2 y1
一级索引 二级索引
A a 0.782213 0.264740 0.633578
B a 0.352546 0.210559 0.693152
A b 0.629361 0.460047 0.982339
以上是 Pandas 分层索引的基本知识和操作方法,希望对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何使用 Pandas 的分层索引 - Python技术站