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] =].
您必须先删除 X
和 Y
级别才能匹配索引:
# 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
我有一个 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] =].
您必须先删除 X
和 Y
级别才能匹配索引:
# 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