从顶层的一个标签中检索所有列以及另一个标签的子集
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
【讨论】:
以上是关于从顶层的一个标签中检索所有列以及另一个标签的子集的主要内容,如果未能解决你的问题,请参考以下文章