从顶层的一个标签中检索所有列以及另一个标签的子集

Posted

技术标签:

【中文标题】从顶层的一个标签中检索所有列以及另一个标签的子集【英文标题】:Retrieve all columns from one label in the top level alongside only a subset of another label 【发布时间】:2021-07-05 05:36:03 【问题描述】:

我有一个类似这样的数据框:

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

调用pd.concat()df.drop() 来检索第一组的所有列和第二组的子集的最简洁方法是什么?结果应该是这样的

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

我尝试了一些变化

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

但都抛出NotImplementedError: Index._join_level on non-unique index is not implemented

【问题讨论】:

【参考方案1】:

我认为concat 是这里最简单的方式,但它是可能的,例如如果以某种方式创建掩码并通过| 按位加入它们OR

m1 = df.columns.isin([('df2','d'), ('df2','e')]) 
m2 = df.columns.get_level_values(0) == 'df1'

df = df.loc[:, m1 | m2]
print (df)
  df1          df2     
    a   b   c    d    e
0   0   1   2  100  101
1   3   4   5  103  104
2   6   7   8  106  107
3   9  10  11  109  110

或者动态创建元组,例如:

L1 = df.columns[df.columns.get_level_values(0) == 'df1'].tolist()
L2 = [('df2','d'), ('df2','e')]

df = df[L1 + L2]
print (df)
  df1          df2     
    a   b   c    d    e
0   0   1   2  100  101
1   3   4   5  103  104
2   6   7   8  106  107
3   9  10  11  109  110

【讨论】:

以上是关于从顶层的一个标签中检索所有列以及另一个标签的子集的主要内容,如果未能解决你的问题,请参考以下文章

从 PHP 函数中的推文中检索所有主题标签

从 Dataframe 列中提取标签

如何从所有文档的子集合中检索所有数据

如何从标签页的嵌入表单中检索文本框?

我在 Node JS 中检索 Git 标签信息的方法很慢,如何加快速度?

Hibernate中bag标签有啥用?