python multiindex函数

  • Post category:Python

当我们在使用Pandas处理多维数据时,可以使用MultiIndex函数来创建和操作多层索引。下面是关于使用Python MultiIndex函数的完整攻略:

MultiIndex函数基础

创建MultiIndex

我们可以使用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'])

其中,arrays表示声明一个多维列表,然后用list(zip(*arrays))得到元组列表tuples。names参数在MultiIndex对象创建时指定索引名称,first作为第一层索引,second作为第二层索引。创建出来的对象index现在所包含的有两个层次的索引以及3个数据:

MultiIndex([('bar', 'one'),
            ('bar', 'two'),
            ('baz', 'one'),
            ('baz', 'two'),
            ('foo', 'one'),
            ('foo', 'two'),
            ('qux', 'one'),
            ('qux', 'two')],
           names=['first', 'second'])

层次索引

我们可以使用MultiIndex对象的方法来访问数据的层次索引,比如使用get_loc方法来查找索引中“bar”第一个出现的位置:

index.get_loc(('bar', 'one'))

注意这里传入的是一个元组形式,表示了两个层次索引值,返回的是该位置的整数索引。我们也可以使用MultiIndex的get_level_values方法来获取相应的索引值:

index.get_level_values(0)

返回的结果是MultiIndex对象的第一层索引,即:

Index(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], dtype='object', name='first')

利用MultiIndex操作DataFrame

创建基础数据

为了演示如何操作和使用MultiIndex,我们先创建一个多维DataFrame。

import numpy as np

np.random.seed(0)
index = pd.MultiIndex.from_product([['A', 'B'], ['C', 'D']], names=['Index1', 'Index2'])
df = pd.DataFrame(np.random.randn(4, 2), index=index, columns=['col1', 'col2'])

其中,我们创建了一个2层次索引的对象,并将它作为DataFrame的索引index。这个DataFrame是一个4×2的矩阵,使用了随机生成的值作为数据:

                     col1      col2
Index1 Index2                      
A      C         1.764052  0.400157
       D         0.978738  2.240893
B      C         1.867558 -0.977278
       D         0.950088 -0.151357

索引操作

我们可以使用.loc方法对MultiIndex进行索引操作,其中使用列表来指定每个层次的值:

df.loc[('A', 'C'), 'col1']

返回的结果是该位置的实际值1.764052。

我们也可以使用切片来获取MultiIndex的数据。例如,获取A和B的全部数据:

df.loc[['A', 'B'], :]

利用第一层索引中的A和B来选择数据。返回的结果如下:

                     col1      col2
Index1 Index2                      
A      C         1.764052  0.400157
       D         0.978738  2.240893
B      C         1.867558 -0.977278
       D         0.950088 -0.151357

常规操作

我们也可以使用Pandas的现有函数不必担心MultiIndex的数据类型。例如,计算每个索引层次的平均值:

df.mean(level='Index1')

其中对index1层次进行groupby操作,返回每个index1对应的平均值:

           col1      col2
Index1                    
A       1.371395  1.320525
B       1.408823 -0.564318

还可以使用sort_index方法来根据某一层次排序:

df.sort_index(level=0, axis=0, ascending=False, inplace=True)

其中level指定了排序方式,传入True则升序排序:

                     col1      col2
Index1 Index2                      
B      D         0.950088 -0.151357
       C         1.867558 -0.977278
A      D         0.978738  2.240893
       C         1.764052  0.400157

MultiIndex函数提供了处理多维数据的强大功能,我们可以运用它的各种操作实现更加复杂的数据分析任务。