如何在3D-Pandas数据框中找到包含特定子列/嵌套列的列

时间:2018-09-23 06:29:21

标签: 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”。我真的是Pandas的新手,但是盯着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),然后找到使用位置(pos2)在“标签”下的第一个数组中的值(val1),最后使用位置val1在“级别”下的第一个数组中找到列名。

所以我的问题是,是否有更好的“适当”方法来完成所有这些工作?谢谢。

P.S。在单独的注释上,所有这些实际上只是为了让我可以搜索列“ 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 个答案:

答案 0 :(得分: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

levelslabels

我的复杂方法版本

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