I have a pandas Series (S) that has an index like:
bar one a
b
two a
b
baz one a
.
.
I have a conditional function that returns a lower dimensional index. What I am doing is performing something like S.groupby(level=(0,1)).median() > 1
This returns a Series with Index like so:
bar one
baz two
foo one
.
.
How do I slice the original Series with the lower dimensional index?
I know I can reset index and select rows using .isin but I would like to use MultiIndex if possible.
Thanks in advance!
===
Here is what the actual Series (s) looks like:
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
I perform the following operation:
sm = s.groupby(level=(0,1,2)).median()
sigma = sm.std()
sms = sm[sm - sm.median() < sigma/2]
Now sms looks like:
BATCH ITEM SEQ
D1M2 765 6005 4.938
769 6005 5.428
Now I want to slice the series s that match the index in sms only.
So I want this slice of s (that matches the index of 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
CodePudding user response:
It's possible only if your index levels are the same which is not the case here because in s
, you have ['BATCH', 'ITEM', 'SEQ', 'X', 'Y']
and in sms
, you have only ['BATCH', 'ITEM', 'SEQ']
.
You have to drop X
and Y
levels before to match indexes:
# 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