Python 基于部分多索引访问序列

Python 基于部分多索引访问序列,python,pandas,multi-index,Python,Pandas,Multi Index,我有一个非常长的熊猫系列,有一个4级多索引,类似于: objs = ['car', 'bicycle', 'plane'] trials = ['trial A', 'trial B'] moves = [f'mov{i}' for i in range(1,11)] multi = pd.MultiIndex.from_product([objs, trials, moves, range(10)], names=['obj', 'try', 'mov', 'time']) s = pd.Se

我有一个非常长的熊猫系列,有一个4级多索引,类似于:

objs = ['car', 'bicycle', 'plane']
trials = ['trial A', 'trial B']
moves = [f'mov{i}' for i in range(1,11)]
multi = pd.MultiIndex.from_product([objs, trials, moves, range(10)], names=['obj', 'try', 'mov', 'time'])
s = pd.Series(np.random.rand(len(multi)))
我还有一个元组列表,它匹配“obj”和“mov”下的一些索引。例如,在现实中,它要长得多:

idxs = [('car','mov1'), ('car','mov6'), ('plane','mov1')]
是否有一种方法可以获取多个索引包含IDX中的索引的所有s行?我希望在不重新索引/切片该系列的情况下执行此操作,因为正如我所说的,它非常长,而且效率低下。
我阅读了&,两者似乎都不是我所需要的。

一种方法是将列表理解与pd.DataFrame.query结合使用:

def eligible(line):
    if (line[0]=='car' and line[2] in ['mov1', 'mov6']) or (line[0]=='plane' and line[2] == 'mov1'):
        return True
    else:
        return False

s[[i for i, line in enumerate(multi) if eligible(line)]]
pd.concat([s.to_frame().query('obj == @i and mov == @j') for i, j in idxs])

OR (as @Jon Nir Suggests which is faster)

pd.concat([s.xs([i,j], level=[obj, mov]) for i,j in idxs])

我实际的idxs列表要长得多,我无法逐一检查那里的所有条件。此外,将这些条件硬编码到我的脚本中并不是一个很好的做法,而这段代码可能会回答这个问题,提供关于这段代码为什么和/或如何回答这个问题的额外上下文,可以提高其长期价值。@β.εηοιτ.βε好的,很公平,我同意。在目前的状态下,它是否具有负的长期价值?这是否有损社区利益?我本以为这是否决票的条件。@SimonR否决票不是我的,评论是,因为你的答案是在一个评论队列中给我的,我猜有人对你的答案的反应比我更强烈。