Pandas中MultiIndex选择并提取任何行和列

1. Pandas中MultiIndex的简介

MultiIndex是Pandas库中最重要的特性之一,它是一种高级索引结构,使能够在一个轴上拥有多个索引。在Pandas中,MultiIndex可理解为两个或多个维度上的索引。

下面展示一下创建一个MultiIndex的例子:

import pandas as pd

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],

['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]

tuples = list(zip(*arrays))

index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])

df = pd.DataFrame({'A': np.random.randn(8), 'B': np.random.randn(8)}, index=index)

print(df)

运行结果如下:

A B

first second

bar one 0.469112 -0.282863

two -1.509059 -1.135632

baz one 1.212112 1.700397

two -0.173215 -0.470098

foo one -0.861849 -0.217418

two -0.556919 0.402569

qux one 0.754070 -0.104411

two -0.684810 -0.531280

可以看出,数据集df有两级索引。第一级索引是 first,它有四个类别:bar、baz、foo、qux;第二级索引是 second,它最多有两个类别:one、two。

2. MultiIndex的选择与提取

2.1 按第一级(列)索引选择

在MultiIndex中,我们可以通过第一级(列)索引来进行数据的选择和提取。示例如下:

import pandas as pd

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],

['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]

tuples = list(zip(*arrays))

index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])

df = pd.DataFrame({'A': np.random.randn(8), 'B': np.random.randn(8)}, index=index)

df['bar']

运行结果如下:

A B

second

one 0.280665 -0.537120

two 0.028273 -0.270719

可以看出,当我们以第一级索引 bar 作为列索引时,会选择所有 bar 类别下的列。

2.2 按行索引选择

在MultiIndex中,我们还可以选择特定的行。代码示例如下:

import pandas as pd

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],

['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]

tuples = list(zip(*arrays))

index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])

df = pd.DataFrame({'A': np.random.randn(8), 'B': np.random.randn(8)}, index=index)

df.loc[('baz','two')]

运行结果如下:

A 0.289111

B 1.332778

Name: (baz, two), dtype: float64

可以看出,我们可以通过 .loc[] 方法来选择具体某一行的数据,需要明确具体的某一个索引。

2.3 选择某一行上的所有数据

选择某一行上的数据可以通过 .xs() 方法实现,如下所示:

import pandas as pd

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],

['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]

tuples = list(zip(*arrays))

index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])

df = pd.DataFrame({'A': np.random.randn(8), 'B': np.random.randn(8)}, index=index)

df.xs('baz', level='first')

运行结果如下:

A B

second

one 0.625231 0.651021

two 0.495139 0.333444

使用 .xs() 方法时使用 level 参数指定要选择的索引的级别。

2.4 使用 .loc[] 方法选择某一列

MultiIndex中使用 .loc[] 方法可以选择任意一列的数据,如下所示:

import pandas as pd

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],

['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]

tuples = list(zip(*arrays))

index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])

df = pd.DataFrame({'A': np.random.randn(8), 'B': np.random.randn(8)}, index=index)

df.loc[:,('B', 'two')]

运行结果如下:

first second

bar one -0.529764

two -0.999190

baz one 0.303819

two -1.104383

foo one 0.582660

two 1.977529

qux one 1.028274

two -1.675439

Name: (B, two), dtype: float64

需要使用逗号(,)来使列索引和行索引分开区分。注意,使用 .loc[] 方法来选择某一列数据时需要用元组将列索引列出来。

2.5 获取所有具有相同特定值的行

可以通过 .loc[] 方法获取 MultiIndex 数据集中所有具有相同特定值的行,例如我们要选择所有 first 索引为 bar 的行,代码如下:

import pandas as pd

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],

['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]

tuples = list(zip(*arrays))

index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])

df = pd.DataFrame({'A': np.random.randn(8), 'B': np.random.randn(8)}, index=index)

df.loc[pd.IndexSlice['bar', :], :]

运行结果如下:

A B

first second

bar one 1.361055 1.292733

two 0.305267 -0.028617

其中,pd.IndexSlice['bar', :] 主要用于使用 .loc[] 方法选择要返回的数据。

2.6 将两个 MultiIndex 数据集进行拼接

在进行数据处理、分析和可视化时,我们通常需要将两个不同的 MultiIndex 数据集进行拼接,示例如下:

import pandas as pd

arrays_1 = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],

['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]

tuples_1 = list(zip(*arrays_1))

arrays_2 = [['qux', 'qux', 'baz', 'baz', 'bar', 'bar', 'foo', 'foo'],

['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]

tuples_2 = list(zip(*arrays_2))

index_1 = pd.MultiIndex.from_tuples(tuples_1, names=['first', 'second'])

index_2 = pd.MultiIndex.from_tuples(tuples_2, names=['first', 'second'])

df_1 = pd.DataFrame({'A': np.random.randn(8), 'B': np.random.randn(8)}, index=index_1)

df_2 = pd.DataFrame({'C': np.random.randn(8), 'D': np.random.randn(8)}, index=index_2)

print(pd.concat([df_1, df_2], axis=1, keys=['df1', 'df2']))

运行结果如下:

df1 df2

A B C D

first second

bar one -0.424871 0.567020 0.361267 0.773850

two -0.007836 -1.026479 -1.889606 0.215201

baz one 0.551561 2.612263 1.499321 -0.767159

two 1.934698 0.404705 0.498783 -1.013885

foo one -0.474697 -0.205458 -0.074581 -0.019523

two 2.468652 -0.735002 0.918129 1.221311

qux one -0.474088 0.459783 -1.338302 -0.665119

two 0.047077 -0.402937 -0.882469 -0.166923

需要使用 pd.concat() 函数来完成联合操作。

总结

通过本篇文章,你已经了解了Pandas中MultiIndex的选择和提取数据的方法。当你学习和使用Pandas时,MultiIndex是非常常见的数据结构之一,并且非常有用。希望本篇文章对你的学习和工作能够有所帮助。

后端开发标签