📅  最后修改于: 2023-12-03 15:03:28.981000             🧑  作者: Mango
在 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
和行索引类似,我们可以使用元组来指定列索引的值。
比如说,如果想查看列索引为 A
、a
的数据,可以使用:
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 中的后缀的介绍,希望对你有所帮助。