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是非常常见的数据结构之一,并且非常有用。希望本篇文章对你的学习和工作能够有所帮助。