对MultiIndex的取值和切片操作很直观,你可以直接把索引看成额外增加的维度。我们先来介绍Series多级索引的取值与切片方法,再介绍DataFrame的用法。多级索引的数据交互方法有很多,只介绍Series的6种和DataFrame的4种。
注:如果MultiIndex不是有序的索引,那么大多数切片操作都会失效。(参见Pandas多级索引行列转换)
1、Series多级索引
介绍Series的6种索引方式: 1、通过对多个级别索引值获取单个元素; 2、MultiIndex也支持局部取值(partial indexing),即只取索引的某一个层级.假如只取最高级的索引,获得的结果是一个新的Series,未被选中的低层级索引 值会被保留; 3、局部切片,注意:要求MultiIndex是按照顺序排列的; 4、如果索引已经排序,那么可以用较低层级的索引取值,第一层级的索引可以用空切片; 5、其他取值与数据选择的方法。下面的例子是通过布尔掩码选择数据; 6、通过花哨的索引选择数据;
import numpy as np
import pandas as pd
index = [('California', 2000), ('California', 2010),
('New York', 2000), ('New York', 2010),
('Texas', 2000), ('Texas', 2010)]
populations = [33871648, 37253956,
18976457, 19378102,
20851820, 25145561]
pop = pd.Series(populations, index=index)
index = pd.MultiIndex.from_tuples(index)
pop = pop.reindex(index)
pop.index.names = ['state', 'year']
pop
#通过对多个级别索引值获取单个元素
pop['California', 2000]
# MultiIndex也支持局部取值(partial indexing),即只取索引的某一个层级
# 假如只取最高级的索引,获得的结果是一个新的Series,未被选中的低层级索引值会被保留
pop['California']
#局部切片,注意:要求MultiIndex是按照顺序排列的
#.loc显式索引器
pop.loc['California' : 'New York']
# 如果索引已经排序,那么可以用较低层级的索引取值,第一层级的索引可以用空切片
pop[:, 2000]
# 其他取值与数据选择的方法。下面的例子是通过布尔掩码选择数据
pop[pop > 22000000]
# 通过花哨的索引选择数据
pop[['California', 'Texas']]
2、DataFrame多级索引
介绍DataFrame的4种方式 1、由于DataFrame的基本索引是列索引,因此Series中多级索引的用法到了DataFrame中就应用在列上了; 2、loc、iloc和ix索引器都可以使用(显式、隐式、混合); 3、虽然这些索引器将多维数据当成二维数据处理,但是在loc和iloc中可以传递多个层级的索引元组(注:这种索引元组的用法不是很方便,在元组中使用切片还会导致语法错误); 4、更好的办法:Pandas中专门解决这种问题的的IndexSlice。
#多级行列索引
index = pd.MultiIndex.from_product([[2013, 2014], [1, 2]],
names=['year', 'visit'])
columns = pd.MultiIndex.from_product([['Bob', 'Guido', 'sue'], ['HR', 'Temp']],
names=['subject', 'type'])
#模拟数据
data = np.round(np.random.randn(4, 6), 1)
data[:, ::2] *= 10
data += 37
#创建DataFrame
health_data = pd.DataFrame(data, index=index, columns=columns)
health_data
#由于DataFrame的基本索引是列索引,因此Series中多级索引的用法到了DataFrame中就应用在列上了
health_data['Guido', 'HR']
#loc、iloc和ix索引器都可以使用(显式、隐式、混合)
health_data.iloc[:2, :2]
#虽然这些索引器将多维数据当成二维数据处理,但是在loc和iloc中可以传递多个层级的索引元组(注:这种索引元组的用法不是很方便,在元组中使用切片还会导致语法错误)
health_data.loc[:, ('Bob', 'HR')]
#(注:这种索引元组的用法不是很方便,在元组中使用切片还会导致语法错误)
health_data.loc[(:, 1), (:, 'HR')]
#更好的办法:Pandas中专门解决这种问题的的IndexSlice。
idx = pd.IndexSlice
health_data.loc[idx[:, 1], idx[:, 'HR']]
本文来自《python数据科学手册》,详情请参照原书。