【问题标题】:Slicing with Multindexing with Pandas使用 Pandas 进行多索引切片
【发布时间】:2018-11-22 19:01:55
【问题描述】:

我正在尝试同时在两个轴上使用 Multindexing 进行切片,但出现异常:

multi_index_0 = pd.MultiIndex.from_product([['A', 'B', 'C'], ['a' , 'b']], names=['first', 'second'])
multi_index_1 = pd.MultiIndex.from_product([['D', 'E'], ['c' , 'd']], names=['first', 'second'])
df = pd.DataFrame(np.random.randn(6, 4), multi_index_0, multi_index_1)

现在,我想对行 ['A', 'b] 和 ['B', 'a'] 以及列 ['D', 'c'] 和 ['E', 'd'] 进行切片.

我尝试了以下方法,但没有成功:

df.loc[['A', 'b'], ['B', 'a']], [['D', 'c'], ['E', 'd']]

重新运行空数据帧

df.loc[['A', 'B'], ['b', 'a']], [['D', 'E'], ['c', 'd']]

返回空数据框

df.loc[([['A', 'B'], ['b', 'a']]), ([['D', 'E'], ['c', 'd']])]

TypeError: '['A', 'B']' is an invalid key

df.loc[([['A', 'b'], ['B', 'a']]), ([['D', 'c'], ['E', 'd']])]

TypeError: '['A', 'b']' is an invalid key

【问题讨论】:

    标签: python pandas slice multi-index


    【解决方案1】:

    使用Index.isin 作为布尔掩码,然后通过loc 选择:

    m1 = df.index.isin((['A', 'b'], ['B', 'a']))
    m2 = df.columns.isin((['D', 'c'], ['E', 'd']))
    
    df = df.loc[m1, m2]
    print (df)
    first                D         E
    second               c         d
    first second                    
    A     b      -0.915119 -0.038221
    B     a      -1.224615 -0.873551
    

    【讨论】:

      【解决方案2】:

      虽然很傻,多索引适用于元组,但不适用于列表...(可能有充分的理由,以避免在我无法在现场处理的边缘情况下产生歧义)。所以你可以这样做:

      df.loc[[('A','b'),('B','a')], [('D', 'c'), ('E', 'd')]]
      

      当然,jezrael 的解决方案也有效,我只是觉得这更优雅(而且可能更快)。

      [编辑]:你的第一个命令 df.loc[['A', 'b'], ['B', 'a']], [['D', 'c'], ['E', 'd']] 返回一个空的 DataFrame 因为你错过了括号,所以实际上你正在有效地做 df.loc[['A', 'b'], ['B', 'a']] (加上旁边的一个列表,所以答案将是一个空 df 的元组+ 列表)。这对 Pandas 意味着:请同时给我所有元素:

      • 具有以 A 开头的索引 与 b
      • 具有以 B 开头的列 与 a。

      因为没有这样的列,所以你得到一个空框架。

      您可能的意思是:df.loc[[['A', 'b'], ['B', 'a']], [['D', 'c'], ['E', 'd']]],但是,它给出了一个例外,因为您再次使用列表而不是元组。

      【讨论】:

        猜你喜欢
        • 2014-05-02
        • 2018-12-11
        • 2014-10-21
        • 2021-12-07
        • 2014-07-31
        • 2016-12-12
        • 2015-03-16
        • 2021-08-25
        • 2018-03-12
        相关资源
        最近更新 更多