在pandas中使用具有MultiIndex的切片器

时间:2015-05-13 15:42:41

标签: pandas

我正在尝试在带有MultiIndex的pandas数据帧上使用切片器:

dates = pd.date_range('6/30/2000', periods=12, freq='M')
index = MultiIndex.from_arrays([dates, list('HIJKHIJKHIJKHIJK')], names=['date', 'id'])
df = DataFrame(randn(12, 4), index=index, columns=['A', 'B', 'C', 'D'])

我想获取id='H'的行。在我提出的相关问题this comment中,以及在阅读the documentation后,我想到了这一点:

df.loc[(slice(None), 'H'),:]

或者也许这样:

df.loc[(slice(None), ['H']),:]

会奏效。第一个返回此错误:

  

IndexError:索引12超出了轴1的大小为12

,第二个给出了这个错误:

  

IndexError:指数超出范围

从其他问题看,我想也许我需要在尝试切片前按二级索引排序。我不确定我在这里做了什么,但我尝试使用df.sort_index()但是我的语法有问题。我也不确定这是否是问题。

1 个答案:

答案 0 :(得分:0)

你的行中有问题

index = MultiIndex.from_arrays([dates, list('HIJKHIJKHIJKHIJK')], names=['date', 'id'])

数组的长度应相同。这不是提高可能是一个错误。

如果您修复了

之一
In [58]: df.xs('H', level='id')
Out[58]:
                   A         B         C         D
date
2000-06-30 -0.645203  0.965441  0.150037 -0.083979
2000-10-31 -1.222954  0.498284 -1.249005 -1.664407
2001-02-28 -0.941248  2.025381  0.450256  1.182266

In [59]: df.loc[(slice(None), 'H'), :]
Out[59]:
                      A         B         C         D
date       id
2000-06-30 H  -0.645203  0.965441  0.150037 -0.083979
2000-10-31 H  -1.222954  0.498284 -1.249005 -1.664407
2001-02-28 H  -0.941248  2.025381  0.450256  1.182266

应该有效,具体取决于您是否要放弃id级别。