Pandas multiIndex 聚合切片

Pandas multiIndex slicing by aggregate

我有一个 pandas 系列 (S),其索引如下:

bar  one  a
          b
     two  a
          b
baz  one  a
.
.

我有一个条件函数,returns 一个低维索引。我正在做的是执行类似 S.groupby(level=(0,1)).median() > 1

这个 returns 具有如下索引的系列:

bar  one 
baz  two
foo  one 
. 
. 

如何使用较低维索引对原始系列进行切片?

我知道我可以使用 .isin 重置索引和 select 行,但我想尽可能使用 MultiIndex。

提前致谢!

===

这是实际系列的样子:

BATCH    ITEM  SEQ   X   Y 
D1M2     765   6005  -5   0    5.085
         769   6005  -3  -2    6.174
         767   6005  -4  -1    5.844
         769   6005  -3  -1    5.702
                     -4   2    5.154
         767   6005  -3   2    5.337
                     -2   4    5.683
                      3   0    6.178
         769   6005  -3   2    5.128
         765   6005   1  -4    4.791

我执行以下操作:

sm = s.groupby(level=(0,1,2)).median()
sigma = sm.std()
sms = sm[sm - sm.median() < sigma/2]

现在短信看起来像:

BATCH    ITEM  SEQ 
D1M2     765   6005    4.938
         769   6005    5.428

现在我想对sms中符合index的series进行切片.

所以我想要 s 的这一部分(匹配 sms 的索引):

BATCH    ITEM  SEQ   X   Y 
D1M2     765   6005  -5   0    5.085
         769   6005  -3  -2    6.174
                     -3  -1    5.702
                     -4   2    5.154
                     -3   2    5.128
         765   6005   1  -4    4.791

只有当您的索引级别相同时才有可能,但此处情况并非如此,因为在 s 中,您有 ['BATCH', 'ITEM', 'SEQ', 'X', 'Y'],而在 sms 中,您只有 [=14] =].

您必须先删除 XY 级别才能匹配索引:

# Statically
>>> s[s.index.droplevel(['X', 'Y']).isin(sms.index)]

# Dynamically
>>> s[s.index.droplevel(s.index.names.difference(sms.index.names)).isin(sms.index)]

# Output
BATCH  ITEM  SEQ   X   Y 
DIM2   765   6005  -5   0    5.085
       769   6005  -3  -2    6.174
                       -1    5.702
                   -4   2    5.154
                   -3   2    5.128
       765   6005   1  -4    4.791
dtype: float64