📜  数据帧多索引 - Python (1)

📅  最后修改于: 2023-12-03 14:54:54.296000             🧑  作者: Mango

数据帧多索引 - Python

在 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

以上就是数据帧多索引的简介,希望对您有所帮助!