MultiIndex:高级索引 - 如何选择 DataFrame 的不同部分?

Posted

技术标签:

【中文标题】MultiIndex:高级索引 - 如何选择 DataFrame 的不同部分?【英文标题】:MultiIndex: advanced indexing - how to select different parts of DataFrame? 【发布时间】:2020-10-27 11:32:49 【问题描述】:
arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),
          np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])]

df2 = pd.DataFrame(np.random.randn(8, 4), index=arrays)

我的矩阵是 df2。现在我想选择'foo','one'和'two'的所有行,但只选择multiIndex'bar'的'one'行。这似乎很容易,但我尝试了多种方法都没有成功。

df2.loc['bar':('foo','one')]

,产生一个类似的矩阵,但包括我不想要的“baz”行。

df2.loc[idx['foo','bar'],idx['one','two'], :]

,也类似但第二行的'foo','two'我不要了。

如果有人可以提供帮助并提供一些处理 multiIndex 的技巧,那就太好了!

【问题讨论】:

我非常有信心Select rows in MultiIndex dataFrame 会有所帮助。 感谢您的回复!会看看 与此同时,这似乎是解决您的问题的最快方法:pd.concat([df.loc[['foo']], df.loc[[('bar', 'one')]]]) 【参考方案1】:

在一行中,IMO 最简单的方法是使用查询构建表达式,如 here 所述:

df.query("ilevel_0 == 'foo' or (ilevel_0 == 'bar' and ilevel_1 == 'one')") 

                0         1         2         3
bar one  0.249768  0.619312  1.851270 -0.593451
foo one  0.770139 -2.205407  0.359475 -0.754134
    two -1.109005 -0.802934  0.874133  0.135057

否则,使用更常规的方式,你可以考虑

pd.concat([df.loc[['foo']], df.loc[[('bar', 'one')]]]) 

                0         1         2         3
foo one  0.770139 -2.205407  0.359475 -0.754134
    two -1.109005 -0.802934  0.874133  0.135057
bar one  0.249768  0.619312  1.851270 -0.593451

其中有两部分:

df.loc[['foo']]

                0         1         2         3
foo one  0.770139 -2.205407  0.359475 -0.754134
    two -1.109005 -0.802934  0.874133  0.135057

和,

df.loc[[('bar', 'one')]]

                0         1        2         3
bar one  0.249768  0.619312  1.85127 -0.593451

每个索引周围的大括号是为了防止在切片操作过程中掉级。

【讨论】:

@ezrabloemendaal 请考虑投票并将答案标记为已接受(单击答案左侧的灰色复选标记将其切换为绿色)。它表明您发现此答案很有帮助。谢谢

以上是关于MultiIndex:高级索引 - 如何选择 DataFrame 的不同部分?的主要内容,如果未能解决你的问题,请参考以下文章

Python 数据处理(二十九)—— MultiIndex 高级索引操作

选择 Pandas DataFrame 的第二个 MultiIndex 级别作为索引器

如何重新索引 MultiIndex 数据帧

如何使用日期索引和多级列进行切片 (MultiIndex)

如何使用 MultiIndex 重新索引?

如果存在多索引,熊猫将不允许选择列?