Python 如何在3D Dataframe中查找包含特定子列/嵌套列的列

Python 如何在3D Dataframe中查找包含特定子列/嵌套列的列,python,pandas,dataframe,3d,Python,Pandas,Dataframe,3d,因此,我有以下3D熊猫数据帧,new: unique cat numerical c f b d a e 0 2 5 1 3 0 4 1 8 11 7 9 6 10 2 14 17 13 15 12 16 我想找出哪个“浅”列包含“深”列“d”,即“cat”。我对熊猫很陌生,但在看了一段时间的new.column

因此,我有以下3D熊猫数据帧,
new

  unique     cat     numerical    
       c   f   b   d         a   e
0      2   5   1   3         0   4
1      8  11   7   9         6  10
2     14  17  13  15        12  16
我想找出哪个“浅”列包含“深”列“d”,即“cat”。我对熊猫很陌生,但在看了一段时间的
new.columns
之后:

MultiIndex(levels=[['cat', 'numerical', 'unique'], ['a', 'b', 'c', 'd', 'e', 'f']],
           labels=[[2, 2, 0, 0, 1, 1], [2, 5, 1, 3, 0, 4]])
我终于明白了这似乎是一种冗长的、嵌套的、复杂的方法,这让我明白了
'cat'

print(
    new.columns.levels[0][\
    new.columns.labels[0][\
    pd.Index(new.columns.labels[1]).get_loc(\
    pd.Index(new.columns.levels[1]).get_loc('d'))]]
)
我基本上得到了第二个数组中“d”在levels下的位置(我们称之为pos1),然后在labels下的第二个数组中找到该值(pos1)的位置(pos2),然后使用该位置(pos2)在labels下的第一个数组中找到值(val1),最后,使用position val1查找“levels”下第一个数组中的列名

所以我的问题是,有没有更好的“正确”的方式来做这一切?谢谢

另请注意,所有这些实际上只是为了让我可以搜索“d”列,而不知道它属于哪个“浅”列:

row = (new.loc[new['cat']['d'] == 9])
这样我就可以:

  unique     cat     numerical    
       c   f   b   d         a   e
1      8  11   7   9         6  10
因此,如果有一种方法可以做到这一点,整个问题都可以避免。(我对堆栈溢出也不熟悉,我是否必须将其放入新问题或smt中)

swaplevel
但是你不能保证有一个唯一的列,所以我用
iloc[:,0]

new[new.swaplevel(0, 1, 1).d.iloc[:, 0].eq(9)]

  unique     cat    numerical    
       c   f   b  d         a   e
1      8  11   7  9         6  10

xs
关于不保证唯一性的相同警告

new[new.xs('d', 1, 1).iloc[:, 0].eq(9)]

  unique     cat    numerical    
       c   f   b  d         a   e
1      8  11   7  9         6  10

indexlice

级别
标签
我对复杂方法的看法

a0, a1 = new.columns.labels
b0, b1 = new.columns.levels

j = b1.get_loc('d')
i = a0[(a1 == j).argmax()]
t = (b0[i], b1[j])

new[new[t] == 9]

  unique     cat    numerical    
       c   f   b  d         a   e
1      8  11   7  9         6  10

“无保证唯一列”是指具有相同名称的两列或更多列吗?此外,您的swaplevel方法实际上不适用于我,因为我的列名实际上是带有空格和句号的调查问题。使用swaplevel的方法就是这样限制的吗?@NathanTew它不是swaplevel。这是我在以后访问时使用的.d而不是['d']
a0, a1 = new.columns.labels
b0, b1 = new.columns.levels

j = b1.get_loc('d')
i = a0[(a1 == j).argmax()]
t = (b0[i], b1[j])

new[new[t] == 9]

  unique     cat    numerical    
       c   f   b  d         a   e
1      8  11   7  9         6  10