2013-11-14 16 views
15

私はcsvファイルからImをロードし、set_indexメソッドでインデックスをカラムの数(通常は2または3)に設定するデータフレームを持っています。アイデアは、次のような、いくつかのキーの組み合わせを使用してデータフレームのその後のアクセス部分にある:データフレームのマルチインデックスは十分な深さにソートされている場合マルチインデックスからフルデプス(パンダ)をソートする

df.set_index(['fileName','phrase']) 
df.ix['somePath','somePhrase'] 

Appearntly、複数のキーで選択のこのタイプにのみ可能です。この場合、2つのキーを供給しているため、データフレームのマルチインデックスが少なくとも2の深さにソートされている場合にのみ.ix操作が失敗することはありません。何らかの理由でインデックスを設定すると、私は両方のレイヤーがソートされていると思われます。df.index.lexsort_depthコマンドは1を返し、2つのキーでアクセスしようとすると次のエラーが表示されます:MultiIndex lexsort depth 1, key was length 2

ヘルプがありますか?

答えて

11

あなたは何を求めているのかは分かりません。マルチインデックスのドキュメントは、ザ・OPがそれからちょうど多分

df.ix[('somePath','somePhrase')] 

特定の結果を得るために、タプルを経由して、これらのレベルにアクセスする場所

df.set_index(['fileName','phrase'],inplace=True) 
df.sortlevel(inplace=True) 

に並べ替えた後、インデックスを設定する必要があるhere

ですこのようなおもちゃの例を挙げて、具体的な結果を得たいと思っていることを示してください。

In [1]: arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']) 
    ...: .....: , 
    ...: .....:   np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']) 
    ...: .....:   ] 

In [2]: df = DataFrame(randn(8, 4), index=arrays) 

In [3]: df 
Out[3]: 
       0   1   2   3 
bar one 1.654436 0.184326 -2.337694 0.625120 
    two 0.308995 1.219156 -0.906315 1.555925 
baz one -0.180826 -1.951569 1.617950 -1.401658 
    two 0.399151 -1.305852 1.530370 -0.132802 
foo one 1.097562 0.097126 0.387418 0.106769 
    two 0.465681 0.270120 -0.387639 -0.142705 
qux one -0.656487 -0.154881 0.495044 -1.380583 
    two 0.274045 -0.070566 1.274355 1.172247 

In [4]: df.index.lexsort_depth 
Out[4]: 2 

In [5]: df.ix[('foo','one')] 
Out[5]: 
0 1.097562 
1 0.097126 
2 0.387418 
3 0.106769 
Name: (foo, one), dtype: float64 

In [6]: df.ix['foo'] 
Out[6]: 
      0   1   2   3 
one 1.097562 0.097126 0.387418 0.106769 
two 0.465681 0.270120 -0.387639 -0.142705 

In [7]: df.ix[['foo']] 
Out[7]: 
       0   1   2   3 
foo one 1.097562 0.097126 0.387418 0.106769 
    two 0.465681 0.270120 -0.387639 -0.142705 

In [8]: df.sortlevel(level=1) 
Out[8]: 
       0   1   2   3 
bar one 1.654436 0.184326 -2.337694 0.625120 
baz one -0.180826 -1.951569 1.617950 -1.401658 
foo one 1.097562 0.097126 0.387418 0.106769 
qux one -0.656487 -0.154881 0.495044 -1.380583 
bar two 0.308995 1.219156 -0.906315 1.555925 
baz two 0.399151 -1.305852 1.530370 -0.132802 
foo two 0.465681 0.270120 -0.387639 -0.142705 
qux two 0.274045 -0.070566 1.274355 1.172247 

In [10]: df.sortlevel(level=1).index.lexsort_depth 
Out[10]: 0 
+0

私は明らかだと思いました。私はあなたが既にリンクしている医者を見ましたが、それは助けになりませんでした。問題は、そのキーで特定の行にアクセスしようとすると開始されます。索引がすべてのレベルでソートされていない場合は、エラーが発生します。質問はすべてのレベルでインデックスを並べ替える方法です – idoda

+0

ちょうど '' df.sortlevel() '' – Jeff

+0

私はしました、それは正しく動作していません。私が 'fileName'でソートレベルを設定すると、外側のインデックスがソートされ、インナー( 'フレーズ')がミックスされます。内部レベルがソートされている間、私は 'フレーズ'によってソートレベル、outerlevel( 'fileName')が混ざり合います。どちらの場合も、ソートの深さは1で、2つのキーでdfにアクセスすることができません。外側のインデックスを並べ替えるにはいくつかの方法が必要ですし、外側のインデックスの順序を変更することなく内側のインデックスを並べ替える**必要があります。すなわち、 - 私はソートの2つの層が必要です。 – idoda

4

私はいくつかの時間が経過している実感が、私は、データフレームは、列とインデックスの両方に複数のインデックスを有することができるときに受け入れ答えはマルチインデックスのデータフレーム上で動作していないと、@idodaがやったのと同じ問題を抱えているように見えます。

df.sortlevel(inplace=True,sort_remaining=True) 

をそして、まだ取得している:あなたがしようとした場合、現在ここには示されていないトリックも、例えば1

に設定することができ、ゼロにデフォルト設定が、「軸」オプションがあるということですlexsortエラーは、デフォルトの "axis = 0" kwargであることを知ることと関連があります。したがって、あなたも追加しようとすることができます

df.sortlevel(axis=1,inplace=True,sort_remaining=True) 

どちらが他の方向を並べ替える必要があります。完全にすべてのレベルでの列と行のインデックスの両方を並べ替える必要があります

df.sortlevel(axis=0,inplace=True,sort_remaining=True) 
df.sortlevel(axis=1,inplace=True,sort_remaining=True) 

:あなたはそれについて考えるしたくない場合は、とだけ強引にそれをすることができます。私はここで同じ問題があり、提案された答えで完全なlexsortを得ることができませんでしたが、少しの研究では、sort_remaining Trueであってもsortlevelは1つの軸だけに適用されます。これらのスニペットは、現在のpythonicネイティブの回答と思われる解決策です。誰かが助けてくれることを願っています!

0

パンダは以下を提供します。あなたは、ほとんどの場合、やりたいだろう

d = d.sort_index() 
print d.index.is_lexsorted() # Sometimes true 

。 しかし、常にインデックスをソートしますが、インデックスにNANがある場合などは、「lexsorted」のままにしておいてもかまいません( generates a PerformanceWarning)。違いがありますなぜ文書化されていないようだけれども...

d = d.sort_index(level=d.index.names) 
print d.index.is_lexsorted() # true 

:この問題を回避するには

関連する問題