问题描述
    所以我有以下 3D Pandas Dataframe, 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”,即“猫”。 
    我对 Pandas 真的很new.columns ,但在盯着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' 的位置(我们称之为 pos1),然后在标签下的第二个数组中找到该值(pos1)的位置(pos2),然后找到值( val1) 使用该位置 (pos2) 在 'labels' 下的第一个数组中,最后使用位置 val1 在 'levels' 下的第一个数组中找到列名。
所以我的问题是,有没有更好的、“正确的”方式来做这一切? 谢谢。
PS 在单独的说明中,所有这些实际上只是为了我可以在不知道它属于哪个“浅”列的情况下搜索“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 中)
1楼
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
 IndexSlice
 
  new[new.loc[:, pd.IndexSlice[:, 'd']].iloc[:, 0].eq(9)]
  unique     cat    numerical    
       c   f   b  d         a   e
1      8  11   7  9         6  10
 
     levels和labels
 
  我的复杂方法版本
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