用熊猫的多索引切片

时间:2018-06-13 08:58:51

标签: python pandas slice multi-index

我正在尝试同时在两个轴上使用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

您的建议将不胜感激。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

实际上是愚蠢的,多索引与元组一起工作但不与列表一起工作......(可能有充分的理由,为了避免在边缘情况下出现歧义,我当场无法做到这一点)。所以你可以这样做:

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 +列表的元组)。这对熊猫意味着:请同时给我所有的元素:

  • 索引以A 开头,以b
  • 开头
  • 以B 开头的列为。

由于没有这样的列,你会得到一个空框架。

您可能意味着:df.loc[[['A', 'b'], ['B', 'a']], [['D', 'c'], ['E', 'd']]],然而,这会产生异常,因为您再次使用列表而不是元组。