pandas MultiIndex的多个切片器

hvvq6cgz  于 2023-05-27  发布在  其他
关注(0)|答案(4)|浏览(125)

我想从具有多个独立索引器的MultiIndex中选择多个列。举个例子

df = pd.DataFrame(
    np.zeros((2,4)),
    columns=pd.MultiIndex.from_product([('a','b'),(1,2)])
)

从该DataFrame

a       b   
    1   2   1   2
0   0   0   0   0
1   0   0   0   0

我想选择'a'加上('b', 1)下的所有列,就像df[[('a', 1), ('a', 2), ('b', 1)]]一样,但我不想显式指定'a'下的列的所有级别。
什么不起作用:

  • df[['a', ('b', 1)]]KeyError: "[('b', 1)] not in index"
  • df.loc[:, ['a', ('b', 1)]]KeyError: "[('b', 1)] not in index"
  • df[[('a', slice(None)), ('b', 1)]]TypeError: unhashable type: 'slice'
  • df.loc[:, [pd.IndexSlice['a', :], ('b', 1)]]TypeError: unhashable type: 'slice'

我想做的另一件类似的事情是:('a', 1) + pd.IndexSlice[:, 2]

iovurdzv

iovurdzv1#

对于共享的示例,切片工作正常:

df.loc(axis=1)[('a',1):('b',1)]
     a         b
     1    2    1
0  0.0  0.0  0.0
1  0.0  0.0  0.0
8yoxcaq7

8yoxcaq72#

您可以分别选择列并将它们连接起来。

out = pd.concat([df.xs('a', axis=1, drop_level=False),
                 df.xs(('b', 1), axis=1, drop_level=False)],
                axis=1)
print(out)

     a         b
     1    2    1
0  0.0  0.0  0.0
1  0.0  0.0  0.0
yqlxgs2m

yqlxgs2m3#

下面是一个使用两个布尔掩码的选项

m1 = df.columns.get_level_values(0).isin(['a'])
m2 = df.columns.get_level_values(1).isin([1])

df.loc[:,m1|m2]

输出:

a         b
     1    2    1
0  0.0  0.0  0.0
1  0.0  0.0  0.0
z9smfwbn

z9smfwbn4#

另一种可能的解决方案:

df.loc[:,('a', slice(None))].join(df.loc[:,('b', 1)])

或者:

df[[(x,y) for x, y in df.columns if (x == 'a') | ((x == 'b') & (y == 1))]]

输出:

a         b
     1    2    1
0  0.0  0.0  0.0
1  0.0  0.0  0.0

相关问题