2016-08-22 25 views
2

複数の列に対してget_level_valuesの結果を得る方法はありますか?複数の列のパンダget_level_values

考えるDataFrame

[(1, 10), (1, 11), (1, 12), (2, 13), (2, 14), (3, 15)] 

注:

  d 
a b c  
1 4 10 16 
    11 17 
    5 12 18 
2 5 13 19 
    6 14 20 
3 7 15 21 

私はレベルacの値(タプルのすなわちリスト)を取得したいです

  • get_level_valuesに複数のレベル(など)を指定することはできません。例えば

a_list = df.index.get_level_values('a').values 
c_list = df.index.get_level_values('c').values 

print([i for i in zip(a_list,c_list)]) 
[(1, 10), (1, 11), (1, 12), (2, 13), (2, 14), (3, 15)] 

が、それは数として面倒を取得1は、所望の各列の上にget_level_valuesを使用してzipそれらを一緒にできている回避策はありますdf.index.get_level_values(['a','c']

  • 列の成長

    • DataFrameを構築するためのコード:

    df = pd.DataFrame({'a':[1,1,1,2,2,3],'b':[4,4,5,5,6,7,],'c':[10,11,12,13,14,15], 'd':[16,17,18,19,20,21]}).set_index(['a','b','c'])

  • 答えて

    3

    MultiIndex.tolist()方法は、MultiIndexのすべてのレベルのためのタプルのリストを提供します。たとえば、あなたの例DataFrameで、だからここ

    df.index.tolist() 
    # => [(1, 4, 10), (1, 4, 11), (1, 5, 12), (2, 5, 13), (2, 6, 14), (3, 7, 15)] 
    

    は2つのアイデアです:

    1. は、元MultiIndexからタプルのリストを取得し、その結果をフィルタリングします。

      [(a, c) for a, b, c in df.index.tolist()] 
      # => [(1, 10), (1, 11), (1, 12), (2, 13), (2, 14), (3, 15)] 
      

      この単純な方法の欠点は、必要なレベルの順序を手動で指定したことです。 itertools.compressを利用すると、代わりに名前で選択することができます。

      from itertools import compress 
      
      mask = [1 if name in ['a', 'c'] else 0 for name in df.index.names] 
      [tuple(compress(t, mask)) for t in df.index.tolist()] 
      # => [(1, 10), (1, 11), (1, 12), (2, 13), (2, 14), (3, 15)] 
      
    2. したい正確なレベルを持っているマルチインデックスを作成し、それに.tolist()を呼び出します。

      df.index.droplevel('b').tolist() 
      # => [(1, 10), (1, 11), (1, 12), (2, 13), (2, 14), (3, 15)] 
      

      あなたはあなたが

      df.index.droplevel([level for level in df.index.names 
             if not level in ['a', 'c']]).tolist() 
      # => [(1, 10), (1, 11), (1, 12), (2, 13), (2, 14), (3, 15)] 
      
    +0

    で 'droplevel'のニースの使用のような何かができる代わりに、あなたは—をドロップしたいものの—を維持したいレベルに名前を付けることを好むだろう場合最後のケース:) – IanS

    0

    これは、あなたが選択したいインデックス名のリストを渡すことができるものであれば、それほど面倒である:

    df.reset_index()[['a', 'c']].to_dict(orient='split')['data'] 
    

    インデックスからレベル'a''b'を選択する方法が見つかりませんでしたオブジェクトを直接使用するため、reset_indexを使用します。

    to_dictがリストやないタプルのリストを返すこと:

    [[1, 10], [1, 11], [1, 12], [2, 13], [2, 14], [3, 15]] 
    
    関連する問題