2016-12-19 4 views
1

この質問は、マルチインデックスの文脈でどのようなレキシソートが行われているかを理解するのに役立ちます。(KeyError):MultiIndexスライスでは、インデックスが完全にレクソートされたタプルである必要があります...なぜこれはリストによって引き起こされますが、タプルではありませんか?

は、私はいくつかのMultiIndexedデータフレームDFを持っており、インデックスのために私が使用したいと言う:

a = (1, 1, 1) 

だから私は書くデータフレームから値を引っ張って:

df.loc[a, df.columns[i]] 

働きます。しかし、次はしていません:

私にエラーを与える
df.loc[list(a), df.columns[i]] 

*** KeyError: 'MultiIndex Slicing requires the index to be fully lexsorted tuple len (1), lexsort depth (0)' 

これはなぜでしょうか?

また、別の質問として、次のパフォーマンス警告はどういう意味ですか?

PerformanceWarning: indexing past lexsort depth may impact performance. 

答えて

6

I、すなわち、このタプルによってインデックス付けここdf.loc[('foo', 'two')]戻る行、(7、df

   0 1 2 
first second   
bar one  4 4 7 
     two  3 4 7 
foo one  8 1 8 
     two  7 5 4 

させて、実施例を用いて、.locにタプルとリストを渡すとの間の差を示していますよ5,4)。パラメータは、マルチインデックスの両方のレベルを指定します。

しかし、df.loc[['foo', 'two']]は、マルチインデックスのトップレベルがすべてのすべての行を 'foo'または 'two'にすることを意味します。リストは、これらがあなたが望むオプションであることを意味し、各オプションには1つのレベルしか提供されないため、選択は最初のレベル(左端)に基づいています。結果:あなたのデータフレームを見ずに

   0 1 2 
first second   
foo one  8 1 8 
     two  7 5 4 

(「2」で始まる何multiindicesがないので、のみ「FOO」が存在している)

、私はどここの違いはわかりませんKeyErrorを取得することにつながりますが、その違い自体が今はっきりしていることを願っています。

関連する問題