在 Pandas MultiIndex 中测试 Slice(None) 的功能

Testing functionality of Slice(None) in Pandas MultiIndex

试图了解 Slice(None) 的用例。构建示例数据框的代码位于此处: https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html, 但为方便起见,我重复了一遍:

    def mklbl(prefix, n):
    return ["%s%s" % (prefix, i) for i in range(n)]


miindex = pd.MultiIndex.from_product(
    [mklbl("A", 4), mklbl("B", 2), mklbl("C", 4), mklbl("D", 2)]
)


micolumns = pd.MultiIndex.from_tuples(
    [("a", "foo"), ("a", "bar"), ("b", "foo"), ("b", "bah")], names=["lvl0", "lvl1"]
)


dfmi = (
    pd.DataFrame(
        np.arange(len(miindex) * len(micolumns)).reshape(
            (len(miindex), len(micolumns))
        ),
        index=miindex,
        columns=micolumns,
    )
    .sort_index()
    .sort_index(axis=1)
)

我正在尝试测试我的理解如下:

dfmi.loc[ (slice('A0'), slice('B0'),slice('C1', 'C2')),:]
dfmi.loc[ (slice('A0'), slice('B0'),slice('C1', 'C2')), ['a']]
dfmi.loc[ (slice('A0'), slice('B0'),slice('C1', 'C2')), slice('a')]

第一行让我从索引中提取 A0、Bo 和 C1、C2。第二行让我提取列索引的所有元素,最后一行只是第二行的重复,使用列索引的切片表示法。

我的问题是 - 我是否可以使用 slice 只提取一个特定的列(比如 'bar')?该文档并没有完全“完成”该示例(它可能建议如何使用 slice 在列索引下提取特定列)。

我试过了:

dfmi.loc[ (slice('A0'), slice('B0'),slice('C1', 'C2')), slice('a', 'bar')]

但这给了我 a 和 b(列的两个索引)。与下面的代码效果相同。

dfmi.loc[ (slice('A0'), slice('B0'),slice('C1', 'C2')), slice('bar')]

最后,

# dfmi.loc[ (slice('A0'), slice('B0'),slice('C1', 'C2')), ['bar']]

给出错误 - 'bar' 不在索引中(如预期的那样)。

我说切片不能用于提取 'a' 和 'bar' 是否正确?我需要切换到 IndexSlice 还是 xs?感谢您的帮助!

这能满足您的需求吗?

dfmi.loc[ (slice('A0'), slice('B0'),slice('C1', 'C2'))]['a','bar']
A0  B0  C1  D0     9
            D1    13
        C2  D0    17
            D1    21
Name: (a, bar), dtype: int32

还是这个?在类似于 index

的列切片周围使用括号
dfmi.loc[ (slice('A0'), slice('B0'),slice('C1', 'C2')),(slice('a'), slice('bar'))]

lvl0          a
lvl1        bar
A0 B0 C1 D0   9
         D1  13
      C2 D0  17
         D1  21

我们可以使用IndexSlice进行高级索引,这是一种更受欢迎的方式:

dfmi.loc[pd.IndexSlice['A0', 'B0', 'C1':'C2'], ('a', 'bar')]

或者 slice 你可以这样做:

dfmi.loc[('A0', 'B0', slice('C1', 'C2')), ('a', 'bar')]

A0  B0  C1  D0     9
            D1    13
        C2  D0    17
            D1    21
Name: (a, bar), dtype: int32