当我们在使用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函数提供了处理多维数据的强大功能,我们可以运用它的各种操作实现更加复杂的数据分析任务。