Pandas多级索引的取值与切片

对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数据科学手册》,详情请参照原书。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值