Python 取多个索引的子集,索引的意外行为

Python 取多个索引的子集,索引的意外行为,python,pandas,indexing,multi-index,Python,Pandas,Indexing,Multi Index,我有来自特定数据流的多次重复的数据,这些数据被组织为多索引数据帧(其中每个重复被标记为,例如,['rep1','rep2',…,'repN'])。我经常需要在一系列重复中获取较大数据帧的子集(例如,df.loc['rep5':'rep50',:]) 但是,如果后续子集的索引仍然保留较大数据帧中的整个索引值列表(即['rep1'、'rep2'、…,'repN']),我无法找到一种方法来实现这一点 因此,对于一个简化的示例,给定以下df: dfs = [pd.DataFrame({'vals': r

我有来自特定数据流的多次重复的数据,这些数据被组织为多索引数据帧(其中每个重复被标记为,例如,
['rep1','rep2',…,'repN']
)。我经常需要在一系列重复中获取较大数据帧的子集(例如,
df.loc['rep5':'rep50',:]

但是,如果后续子集的索引仍然保留较大数据帧中的整个索引值列表(即
['rep1'、'rep2'、…,'repN']
),我无法找到一种方法来实现这一点

因此,对于一个简化的示例,给定以下df:

dfs = [pd.DataFrame({'vals': range(3)}) for i in range(3)]
df = pd.concat(dfs, keys=['l1', 'l2', 'l3'])

df

      vals
l1 0     0
   1     1
   2     2
l2 0     0
   1     1
   2     2
l3 0     0
   1     1
   2     2
然后取其中的一个子集:

subset = df.loc['l2':, :]
subset
      vals
l2 0     0
   1     1
   2     2
l3 0     0
   1     1
   2     2
查看子集的索引,原始的
'l1'
索引仍然是:

subset.index
MultiIndex(levels=[['l1', 'l2', 'l3'], [0, 1, 2]],
           labels=[[1, 1, 1, 2, 2, 2], [0, 1, 2, 0, 1, 2]
但是,如果我重置该索引级别,
'l1'
似乎会消失:

subset.reset_index(level=0)
    level_0 vals
0   l2  0
1   l2  1
2   l2  2
0   l3  0
1   l3  1
2   l3  2
然后我可以把
'level\u 0'
作为索引放回去,基本上达到我想要达到的目标

subset.reset_index(level=0).set_index('level_0', append=True).reorder_levels([1, 0]).index
MultiIndex(levels=[['l2', 'l3'], [0, 1, 2]],
           labels=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]],
           names=['level_0', None])
然而,这显然是一条非常迂回的路线。我认为另一个选项是删除其他行,但我发现在尝试为多索引df执行一系列行时,
df.drop
非常笨拙

如果数据帧不是分层的,则不会发生此行为。例如:

df = pd.DataFrame({'vals': range(5)}, index=['a', 'b', 'c', 'd', 'e'])

df.index
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
然后取一个子集

subset = df.loc[('b', 'c', 'd'),:]
subset.index
Index(['b', 'c', 'd'], dtype='object')

我不清楚为什么会这样

我想,你需要的是

输出:

MultiIndex(levels=[['l2', 'l3'], [0, 1, 2]],
           labels=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]])

@user3014097是的,是0.20.0中的新版本。在旧版本的pandas中是否有处理此问题的方法?在pandas bug tracker中遇到此问题。我想处理它的一种方法是<代码>子集。index。GETA Lovel值(level=0)。UNIQUE()/<代码>,至少对于我正在尝试重复这些重复的特定用例。是的,我在寻找,祝你们好运,如果可以的话,升级到0.20.2。@ USER 3014097请考虑对这个问题进行投票。谢谢
MultiIndex(levels=[['l2', 'l3'], [0, 1, 2]],
           labels=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]])