从具有多个切片的 pandas MultiIndex 中检索列 [重复]

Posted

技术标签:

【中文标题】从具有多个切片的 pandas MultiIndex 中检索列 [重复]【英文标题】:Retrieve columns from pandas MultiIndex with multiple slices [duplicate] 【发布时间】:2021-07-05 05:10:03 【问题描述】:

我有一个包含 MultiIndex 列(2 个级别)的数据框,并且对于第一列的不同组,第二个级别的标签不同。考虑这个例子:

df1 = pd.DataFrame(np.arange(12).reshape(4, 3),
                   columns=list('abc'))
df1.columns = pd.MultiIndex.from_product((["df1"], df1.columns))
df2 = pd.DataFrame(np.arange(100, 112).reshape(4, 3),
                   columns=list('def'))
df2.columns = pd.MultiIndex.from_product((["df2"], df2.columns))
df = pd.concat((df1, df2), axis=1)

看起来像这样

    df1         df2
    a   b   c   d   e   f
0   0   1   2   100 101 102
1   3   4   5   103 104 105
2   6   7   8   106 107 108
3   9   10  11  109 110 111

现在我想找到一种简单的方法来检索第一组和第二组的一个或多个列。 IE。像

    df1     df2
    a   b   d
0   0   1   100
1   3   4   103
2   6   7   106
3   9   10  109

但是,无论我尝试什么,都行不通。 例如,

df.loc[:, [('df1', 'a'), ('df2', ['d', 'e'])]]

抛出TypeError: unhashable type: 'list'

df.loc[:, [pd.IndexSlice['df1', 'a'], pd.IndexSlice['df2', ['d', 'e']]]]

有没有办法在不使用pd.concat 的情况下选择这些列?

【问题讨论】:

【参考方案1】:

您的问题类似于Python Pandas slice multiindex by second level index (or any other level)

那么df.loc[:, (slice(None), ('a', 'b', 'd'))] 应该会给出预期的结果。

【讨论】:

这是一个很好的答案。但是,我刚刚意识到我用错误的方式表达了这个问题。我还希望能够获取第一组的所有列和第二组的子集。我会问另一个。 @zeawoas - su 元组列表是不可能的? @jezrael 这是可能的,但我的实际用例要复杂得多,我想以编程方式查询数据框。为此,这是一个更好的解决方案。我仍然赞成你的回答。【参考方案2】:

您可以将元组列表传递为: df.loc[:,[('df1', 'a'),('df1', 'b'),('df2','d')]

【讨论】:

以上是关于从具有多个切片的 pandas MultiIndex 中检索列 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

带有迭代的 Pandas DataFrame 切片

在 Pandas 中重命名多个列

Python pandas 按多个索引范围切片数据帧

如何从 for 循环返回多个具有唯一名称的 pandas 数据帧?

按行切片 Pandas DataFrame

Pandas - 索引操作