簡體   English   中英

Pandas multiIndex 按聚合切片

[英]Pandas multiIndex slicing by aggregate

我有一個熊貓系列(S),它的索引如下:

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

我有一個返回較低維度索引的條件函數。 我正在做的是執行類似S.groupby(level=(0,1)).median() > 1

這將返回一個帶有索引的系列,如下所示:

bar  one 
baz  two
foo  one 
. 
. 

如何使用較低維索引對原始系列進行切片?

我知道我可以使用 .isin 重置索引和選擇行,但如果可能的話,我想使用 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 中的索引匹配的 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中,您只有['BATCH', 'ITEM', 'SEQ']

您必須先刪除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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM