我正在尝试同时在两个轴上使用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
您的建议将不胜感激。
答案 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 +列表的元组)。这对熊猫意味着:请同时给我所有的元素:
由于没有这样的列,你会得到一个空框架。
您可能意味着:df.loc[[['A', 'b'], ['B', 'a']], [['D', 'c'], ['E', 'd']]]
,然而,这会产生异常,因为您再次使用列表而不是元组。