在DataFrame中出现的MultiIndex级别的组合

Lon*_*Rob 6 python pandas

我有一个像这样的MultiIndexed DataFrame:

In [2]: ix = pd.MultiIndex.from_product([[1, 2, 3], ['foo', 'bar'], ['baz', 'can']], names=['a', 'b', 'c'])
In [3]: data = np.arange(len(ix))
In [4]: df = pd.DataFrame(data, index=ix, columns=['hi'])
In [43]: df = df[~df.hi.isin([2, 3])]
In [44]: df
Out[44]: 
           hi
a b   c      
1 foo baz   0
      can   1
2 foo baz   4
      can   5
  bar baz   6
      can   7
3 foo baz   8
      can   9
  bar baz  10
      can  11
Run Code Online (Sandbox Code Playgroud)

我想知道DataFrame中哪些级别ab出现的对:

[(1, 'foo'), (2, 'foo'), (2, 'bar'), (3, 'foo'), (3, 'bar')]
Run Code Online (Sandbox Code Playgroud)

我可以使用pd.unique,df.index.get_level_values但它似乎有点垃圾:

In [66]: pd.unique(zip(df.index.get_level_values(0), df.index.get_level_values(1)))
Out[66]: array([(1, 'foo'), (2, 'foo'), (2, 'bar'), (3, 'foo'), (3, 'bar')], dtype=object)
Run Code Online (Sandbox Code Playgroud)

有一种"好"的方式吗?

EdC*_*ica 6

您可以调用drop_level您的多索引,然后unique获取您想要的列表:

In [126]:    
df.index.droplevel('c').unique()

Out[126]:
array([(1, 'foo'), (2, 'foo'), (2, 'bar'), (3, 'foo'), (3, 'bar')], dtype=object)
Run Code Online (Sandbox Code Playgroud)


Jef*_*eff 5

In [22]: df.reset_index().set_index(['a','b']).index.unique()
Out[22]: array([(1, 'foo'), (2, 'foo'), (2, 'bar'), (3, 'foo'), (3, 'bar')], dtype=object)
Run Code Online (Sandbox Code Playgroud)

  • 从概念上讲,是的,因为您正在创建一个新索引,然后在该索引上做唯一的.这样你就不必知道剩下的等级(比如说你有10个等级,你不想要的等级就是'难').例如,我们没有办法说,``keeplevels('foo','bar')``(顺便说一下.我们*可以*制作``Index.set_levels``)这样做 (2认同)