我有一个 Pandas 数据框,它具有三层的多级列索引:
我希望对于这个数据框进行遮蔽,基于另一个数据框,该数据框具有索引的最后两个级别:
我希望做的是根据
我尝试使用
import itertools
import numpy as np
def mklbl(prefix, n):
return ["%s%s" % (prefix, i) for i in range(n)]
miindex = pd.MultiIndex.from_product([mklbl('A', 4)])
micolumns = pd.MultiIndex.from_tuples(list(itertools.product(['A', 'B'], ['a', 'b', 'c'], ['foo', 'bar'])),
names=['lvl0', 'lvl1', 'lvl2'])
dfmi = pd.DataFrame(np.arange(len(miindex) * len(micolumns)).reshape((len(miindex), len(micolumns))),
index=miindex,
columns=micolumns).sort_index().sort_index(axis=1)
lvl0 A B
lvl1 a b c a b c
lvl2 bar foo bar foo bar foo bar foo bar foo bar foo
A0 1 0 3 2 5 4 7 6 9 8 11 10
A1 13 12 15 14 17 16 19 18 21 20 23 22
A2 25 24 27 26 29 28 31 30 33 32 35 34
A3 37 36 39 38 41 40 43 42 45 44 47 46
我希望对于这个数据框进行遮蔽,基于另一个数据框,该数据框具有索引的最后两个级别:
cols = micolumns.droplevel(0).unique()
a_mask = pd.DataFrame(np.random.randn(len(dfmi.index), len(cols)), index=dfmi.index, columns=cols)
a_mask = (np.sign(a_mask) > 0).astype(bool)
a b c
foo bar foo bar foo bar
A0 False False False True True False
A1 True False True False True True
A2 True True True True False False
A3 True False False True True False
我希望做的是根据
a_mask
来掩盖原始数据框。例如,当a_mask
为真时,我想将原始条目设置为零。我尝试使用
pd.IndexSlice
,但它静默失败(即我可以运行以下代码,但没有效果:dfmi.loc[:, pd.IndexSlice[:, a_mask]] = 0 #dfmi is unchanged
有什么建议可以实现这个目标吗?
编辑 在我的使用情况下,标签是通过笛卡尔积构建的,因此将存在所有组合的(lev0,lev1,lev2)。 但是有一种情况,即lev0可以假定2个值{A,B},而lev1可以假定3个值{a,b,c}。
dfmi.A
和dfmi.B
的形状是相同的,对吗? - Divakar