关键词

如何使用 Pandas 的分层索引

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 用于位置索引。

  1. 使用 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
  1. 使用 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 方法。其中的冒号用来代表所有一级列索引。

  1. 选取一级索引为 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
  1. 选取一级索引为 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
  1. 选取一级索引为所有行,二级索引为 x1 的列子集。
subset3 = data.loc[:, pd.IndexSlice[:, "x1"]]
print(subset3)

输出结果:

            X
           x1
A a  0.782213
  b  0.629361
B a  0.352546

四、重排分层索引

重排分层索引可以让我们更好地理解 DataFrame 的结构。我们可以针对不同的层进行不同的操作。

  1. 修改索引的级别名称
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
  1. 交换两层索引
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
  1. 按某层索引排序
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 分层索引的基本知识和操作方法,希望对您有所帮助。

本文链接:http://task.lmcjl.com/news/14470.html

展开阅读全文