📜  pandas 中的后缀 - Python (1)

📅  最后修改于: 2023-12-03 15:03:28.981000             🧑  作者: Mango

pandas 中的后缀 - Python

简介

在 Python 的 Pandas 库中,有一个非常有用的后缀概念,用于处理数据中的多级索引和多级列(层次化索引/列)。

这个后缀可以让我们方便地对 DataFrame 和 Series 进行重塑、聚合和探索等操作。

层次化索引

层次化索引是指在一个轴上拥有多个索引级别。比如说,一个二维数组有两个索引,可以看做是一个带有两级索引的 DataFrame。

在 Pandas 中,我们可以通过 MultiIndex 类来构建层次化索引。

import pandas as pd

# 构建一个层次化索引
tuples = [('A', 'a'), ('A', 'b'), ('B', 'a'), ('B', 'b')]
index = pd.MultiIndex.from_tuples(tuples, names=['First', 'Second'])

# 构建一个 DataFrame
data = [[1, 2], [3, 4], [5, 6], [7, 8]]
df = pd.DataFrame(data, index=index, columns=['One', 'Two'])

print(df)

输出:

            One  Two
First Second        
A     a        1    2
      b        3    4
B     a        5    6
      b        7    8

可以看到,我们构建了一个带有两个层级索引的 DataFrame。

我们可以通过使用 .index.names 属性来查看 DataFrame 的索引层级信息:

print(df.index.names)

输出:

['First', 'Second']
索引切片

层次化索引的切片方式和普通索引有些不同。

比如说,如果只想查看 a 类型的数据,我们不能直接使用 df.loc['a'],因为此时的 a 并不是 DataFrame 的一级索引。

正确的方式是使用 .loc 并传入一个元组来指定层级索引的值:

print(df.loc[('A', 'a')])

输出:

One    1
Two    2
Name: (A, a), dtype: int64

如果想查看某一级别所有值的数据,可以使用 : 代替具体的值进行索引切片。

比如说,如果想查看二级索引为 a 的所有数据,可以使用:

print(df.loc[:, 'a'])

输出:

            One  Two
First Second        
A     a        1    2
B     a        5    6
交换索引

在 Pandas 中,我们可以使用 .swaplevel() 方法交换索引的顺序。

比如说,我们可以交换上述 DataFrame 的两个层级索引:

print(df.swaplevel())

输出:

            One  Two
Second First        
a      A      1    2
b      A      3    4
a      B      5    6
b      B      7    8
排序索引

我们可以通过 .sort_index() 方法对索引进行排序。

比如说,我们可以先按照第二级索引升序排序,再按照第一级索引降序排序:

print(df.sort_index(level=[1, 0], ascending=[True, False]))

输出:

            One  Two
First Second        
B     b        7    8
A     b        3    4
B     a        5    6
A     a        1    2

以上就是层次化索引的基本使用方法。

层次化列

层次化索引不仅可以用于行索引,还可以用于列索引。

比如说,我们可以构建一个带有两级列索引的 DataFrame:

import pandas as pd

# 构建一个层次化列
arrays = [['A', 'A', 'B', 'B'], ['a', 'b', 'a', 'b']]
index = pd.MultiIndex.from_arrays(arrays, names=['First', 'Second'])

# 构建一个 DataFrame
data = [[1, 2, 3, 4], [5, 6, 7, 8]]
df = pd.DataFrame(data, columns=index, index=['One', 'Two'])

print(df)

输出:

First   A     B   
Second  a  b  a  b
One     1  2  3  4
Two     5  6  7  8
索引切片

和行索引类似,我们可以使用元组来指定列索引的值。

比如说,如果想查看列索引为 Aa 的数据,可以使用:

print(df.loc[:, ('A', 'a')])

输出:

One    1
Two    5
Name: (A, a), dtype: int64

同样地,我们也可以使用 : 代替具体的值进行索引切片。

比如说,如果想查看第一级别所有列索引为 a 的所有数据,可以使用:

print(df.loc[:, (slice(None), 'a')])

输出:

First   A  B
Second  a  a
One     1  3
Two     5  7
交换索引

和行索引类似,我们也可以使用 .swaplevel() 方法交换列索引的顺序,以及对列索引进行升降序排序。

小结

在 Pandas 中,我们可以使用层次化索引和层次化列的方式来处理复杂的数据结构,使得数据分析变得更加简单、可靠。

以上就是关于在 Python Pandas 中的后缀的介绍,希望对你有所帮助。