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 高级索引操作