2016-10-05 6 views
8

lexsortedすることが必要です。マルチインデックススライスインデックスが完全に私は<code>foo</code><code>year == someYear</code>のX最大観測を選択したい指数(<code>year</code>、<code>foo</code>)、を有するデータフレームを有する

私のアプローチ

df.sort_index(level=[0, 1], ascending=[1, 0], inplace=True) 
df.loc[pd.IndexSlice[2002, :10], :] 

だったが、私は(例えばascending = [0, 0])の仕分けの異なるバリエーションを試してみましたが、それらはすべてのエラーのいくつかの並べ替えの結果

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

を取得します。

xth行だけが必要だった場合は、ソート後にdf.groupby(level=[0]).nth(x)とすることができますが、行のセットが必要なので、それはかなり効率的ではありません。

これらの行を選択するにはどうすればよいですか?

    rank_int rank 
year foo       
2015 1.381845    2 320 
    1.234795    2 259 
    1.148488   199  2 
    0.866704    2 363 
    0.738022    2 319 
+0

'df.sort_index(inplace = True)'を使って並べ替えを行うとどうなりますか? – ASGM

+0

@ASGMそれはうまくいきますが、私が昇順ではないので、間違ったグループの 'foo'を取得します。 – FooBar

答えて

2

ascendingshould be a boolean, not a list:一緒にプレイするために一部のデータ。このようにソートしてみてください。

df.sort_index(ascending=True, inplace=True)

0

たかったように、第2レベルのxth観測を得るためには、iloclocを組み合わせることができます

df.sort_index(level=[0, 1], ascending=[1, 0], inplace=True) 
df.loc[2015].iloc[:10] 

期待通りに動作します。これは奇妙なインデックスロックw.r.tには答えません。しかし、レクソートティング。私にとって

0

それはsort_index(axis=1)を使用して働いていた:

df = df.sort_index(axis=1) 

を一度これを行う、あなたがsliceまたはpandas.IndexSlice、例えばを使用することができます。

df.loc[:, idx[:, 'A']] 
6

まず、あなたは次のようにソート実行する必要があります。

df.sort_index(level=['year','foo'], ascending=[1, 0], inplace=True) 

KeyErrorを修正する必要があります。しかし、df.loc[pd.IndexSlice[2002, :10], :]はあなたに期待している結果を与えるものではありません。 loc関数はilocではなく、fooインデックス0,1..9で検索しようとします。 Multiindexの二次レベルはilocをサポートしていないので、groupbyを使用することをお勧めします。あなたはすでにこのマルチインデックスを持っている場合は、実行する必要があります。

df.reset_index() 
df = df.sort_values(by=['year','foo'],ascending=[True,False]) 
df.groupby('year').head(10) 

nをあなたがtail(n)を使用することができます少なくともfooでのエントリーが必要な場合。たとえば、1番目、3番目、5番目のエントリが必要な場合は、質問に記載されているようにnth([0,2,4])を使用できます。 私はそれができる最も効率的な方法だと思います。

関連する問題