【问题标题】:Testing functionality of Slice(None) in Pandas MultiIndexPandas MultiIndex 中 Slice(None) 的测试功能
【发布时间】:2022-01-24 14:32:40
【问题描述】:

试图了解 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。第二行让我提取 col 索引的所有元素,最后一行是第二行的重复,使用列索引的切片表示法。

我的问题是 - 我可以使用 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?感谢您的帮助!

【问题讨论】:

    标签: pandas slice


    【解决方案1】:

    我们可以使用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
    

    【讨论】:

      【解决方案2】:

      这能得到你想要的吗?

      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
      

      还是这个?在列切片周围使用括号,类似于索引

      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
      

      【讨论】:

      • 谢谢!两者都有效;第二个答案“自然地”深入研究,因为它展示了如何使用 slice 访问所有级别;我发现了解如何充分使用 slice 非常有用。
      猜你喜欢
      • 2020-11-19
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 2020-08-29
      • 2021-04-01
      • 2016-12-05
      相关资源
      最近更新 更多