📅  最后修改于: 2023-12-03 14:54:54.296000             🧑  作者: Mango
在 Pandas 中,我们可以使用多层数据帧索引来方便地对数据进行分组、筛选和聚合操作。多层索引由一个或多个层级索引组成,每个层级索引都可以包含多个标签或值。
我们可以手动创建一个具有多层索引的 Pandas 数据帧。下面的代码演示了如何使用 pd.MultiIndex.from_tuples()
来创建一个二层索引,其中第一层级包含两个标签 'apples' 和 'oranges',第二层级包含三个标签 'California'、'Texas' 和 'New York':
import pandas as pd
# 创建一个二层索引
index = pd.MultiIndex.from_tuples([
('apples', 'California'),
('apples', 'Texas'),
('apples', 'New York'),
('oranges', 'California'),
('oranges', 'Texas'),
('oranges', 'New York')
], names=['fruit', 'region'])
# 创建一个数据帧
data = [[4, 2, 1], [8, 6, 5]]
columns = pd.Index(['Bob', 'Alice', 'Eve'], name='person')
df = pd.DataFrame(data, index=index, columns=columns)
print(df)
输出如下:
person Bob Alice Eve
fruit region
apples California 4 2 1
Texas 8 6 5
New York 4 2 1
oranges California 8 6 5
Texas 4 2 1
New York 8 6 5
我们可以通过指定特定的索引来选择数据帧中的某些部分。例如,我们可以选择所有水果中产自得克萨斯州的:
print(df.loc[:, ('oranges', 'Texas')])
输出如下:
person
Bob 4
Alice 2
Eve 1
也可以选择所有水果的:
print(df.loc['oranges'])
输出如下:
person Bob Alice Eve
region
California 8 6 5
Texas 4 2 1
New York 8 6 5
我们可以使用第一层级索引为 appples 的两个水果地区的切片:
print(df.loc['apples', 'California':'Texas'])
输出如下:
person Bob Alice Eve
region
California 4 2 1
Texas 8 6 5
甚至可以在多层级索引上使用布尔索引:
print(df.loc[(df.index.get_level_values('region') == 'California') & (df['Bob'] >= 6)])
输出如下:
person Bob Alice Eve
fruit region
oranges California 8 6 5
我们可以使用 stack()
和 unstack()
方法来转换多层索引之间的层级结构。以下是如何将数据帧转换为一层索引:
df = df.unstack()
print(df)
输出如下:
person Bob Alice Eve
region California Texas New York California Texas New York California Texas New York
fruit
apples 4 8 4 2 6 2 1 5 1
oranges 8 4 8 6 2 6 5 1 5
我们也可以将一层索引转换为两层索引:
df = df.stack()
print(df)
输出如下:
person Bob Alice Eve
fruit region
apples California 4 2 1
Texas 8 6 5
New York 4 2 1
oranges California 8 6 5
Texas 4 2 1
New York 8 6 5
我们可以使用多层索引来执行分组和聚合操作,例如,计算所有州的平均值:
print(df.mean(level='region'))
输出如下:
person Bob Alice Eve
region
California 5.333333 4.666667 3.666667
Texas 6.000000 3.333333 2.333333
New York 4.000000 3.333333 3.000000
或按水果名称进行分组和聚合:
print(df.groupby(level='fruit').sum())
输出如下:
person Bob Alice Eve
fruit
apples 16 10 7
oranges 20 14 11
以上就是数据帧多索引的简介,希望对您有所帮助!