【问题标题】:Retrieve columns from pandas MultiIndex with multiple slices [duplicate]从具有多个切片的 pandas MultiIndex 中检索列 [重复]
【发布时间】: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 的情况下选择这些列?

【问题讨论】:

    标签: python pandas indexing multi-index


    【解决方案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')]

    【讨论】:

      猜你喜欢
      • 2018-12-29
      • 2021-01-03
      • 2020-11-06
      • 2017-03-28
      • 1970-01-01
      • 2014-12-17
      • 2021-02-11
      • 2021-07-05
      • 2016-01-07
      相关资源
      最近更新 更多