2017-01-28 4 views
1

DataFrameにはMultiIndexがあります。インデックスフィールドはOptionSymbol(レベル0)、QuoteDatetime(レベル1)です。 Iは索引付けおよび並べ替えたDataFrameそう等:MultiIndex DataFrameを第2レベルで解決する方法

sorted = df.sort_values(
    ['OptionSymbol', 'QuoteDatetime'], 
    ascending=[False, True] 
) 

indexed = sorted.set_index(
    ['OptionSymbol', 'QuoteDatetime'], 
    drop=True 
) 

これは、その結果次

OptionSymbolOptionSymbolと昇順 によって降順にフレームが最初でソートされ予想されたように
         Id Strike Expiration OptionType 
OptionSymbol  QuoteDatetime          
ZBYMZ    2013-09-02  234669 170.0 2011-01-22  put 
        2013-09-03  234901 170.0 2011-01-22  put 
        2013-09-04  235133 170.0 2011-01-22  put 
    ...      ...  ...  ...  ...  ... 
YBWNA    2010-02-12  262202 95.0 2010-02-20  call 
        2010-02-16  262454 95.0 2010-02-20  call 
        2010-02-17  262707 95.0 2010-02-20  call 
    ...      ...  ...  ...  ...  ... 
XWNAX    2012-07-12  262201 90.0 2010-02-20  call 
        2012-07-16  262453 90.0 2010-02-20  call 
        2012-07-17  262706 90.0 2010-02-20  call 
    ...      ...  ...  ...  ...  ... 
WWWAX    2012-04-12  262201 90.0 2010-02-20  call 
        2012-04-16  262453 90.0 2010-02-20  call 
        2012-04-17  262706 90.0 2010-02-20  call 
    ...      ...  ...  ...  ...  ... 

グループ。その結果は次のようになり、私がする必要がどのような

QuoteDatetimeの最初の値によって今のリゾートです:

         Id Strike Expiration OptionType 
OptionSymbol  QuoteDatetime          
XBWNA    2010-02-12  262202 95.0 2010-02-20  call 
        2010-02-16  262454 95.0 2010-02-20  call 
        2010-02-17  262707 95.0 2010-02-20  call 
    ...      ...  ...  ...  ...  ... 
NWWAX    2012-04-12  262201 90.0 2010-02-20  call 
        2012-04-16  262453 90.0 2010-02-20  call 
        2012-04-17  262706 90.0 2010-02-20  call 
    ...      ...  ...  ...  ...  ... 
BWNAX    2012-07-12  262201 90.0 2010-02-20  call 
        2012-07-16  262453 90.0 2010-02-20  call 
        2012-07-17  262706 90.0 2010-02-20  call 
    ...      ...  ...  ...  ...  ... 
XBYMZ    2013-09-02  234669 170.0 2011-01-22  put 
        2013-09-03  234901 170.0 2011-01-22  put 
        2013-09-04  235133 170.0 2011-01-22  put 
    ...      ...  ...  ...  ...  ... 

私は、インデックス= 1で頼るのさまざまな方法を試してみたが、その後、私はOptionSymbolを失いますグループ。どうすればこの種のことができますか? df.sort_index(level=1)を使用して、この場合の奇妙

from collections import OrderedDict 
df = OrderedDict((
    ('OptionSymbol', pd.Series(['ZBYMZ', 'ZBYMZ', 'ZBYMZ', 'YBWNA', 'YBWNA', 'YBWNA', 'XWNAX', 'XWNAX', 'XWNAX', 'WWWAX', 'WWWAX', 'WWWAX', ])), 
    ('QuoteDatetime', pd.Series(['2013-09-02', '2013-09-03', '2013-09-04', '2010-02-12', '2010-02-16', '2010-02-17', '2012-07-12', '2012-07-16', '2012-07-17', '2012-04-12', '2012-04-16', '2012-04-17'])), 
    ('Id', pd.Series(np.random.randn(12,))), 
    ('Strike', pd.Series(np.random.randn(12,))), 
    ('Expiration', pd.Series(np.random.randn(12,))), 
    ('OptionType', pd.Series(np.random.randn(12,))) 
)) 

を再作成するためのコードと

編集は、しかし、私の完全なデータセット(20+カラム)上のトリックは私がOptionSymbolグループ化を失うん。

+1

それは簡単にコピー&ペーストすることができます形式のサンプルデータを提供することをお勧めします。私自身の観点からは、データを入力する時間を無駄にしたり、データを複製するために何か他のことをしたりしたくない。私の2セント。 – piRSquared

+0

良い点。これはデータベースから来ており、複製が容易ではありません。 –

+0

@JasonStrimpel、__reproducible__データセット(入力と希望のデータセット)を提供できますか?現在のところ、それはかなり明確ではありません... – MaxU

答えて

2

IIUCあなたは単に秒レベルでのインデックスを並べ替えることができます。

In [27]: df.sort_index(level=1) 
Out[27]: 
           Id Strike Expiration OptionType 
OptionSymbol QuoteDatetime 
YBWNA  2010-02-12  262202 95.0 2010-02-20  call 
      2010-02-16  262454 95.0 2010-02-20  call 
      2010-02-17  262707 95.0 2010-02-20  call 
WWWAX  2012-04-12  262201 90.0 2010-02-20  call 
      2012-04-16  262453 90.0 2010-02-20  call 
      2012-04-17  262706 90.0 2010-02-20  call 
XWNAX  2012-07-12  262201 90.0 2010-02-20  call 
      2012-07-16  262453 90.0 2010-02-20  call 
      2012-07-17  262706 90.0 2010-02-20  call 
ZBYMZ  2013-09-02  234669 170.0 2011-01-22  put 
      2013-09-03  234901 170.0 2011-01-22  put 
      2013-09-04  235133 170.0 2011-01-22  put 
関連する問題