26

(time,ticker) Multiindex およびbid/ask/etc データ列を持つ DataFrame "df" があります。

                          最後のビッド アスク ボリュームの合計
    タイムティッカー                  
    2013-02-01 スパイ 1600 149.70 150.14 150.17 1300
                SLV 1600 30.44 30.38 30.43 3892
                GLD 1600 161.20 161.19 161.21 3860

複数のキーを使用して 2 番目のレベル (レベル = 1) の断面を選択したいと考えています。今のところ、1 つのキーを使用して実行できます。つまり、

    df.xs('SPY', レベル=1)

これにより、SPYの時系列が得られます。マルチキー クロス セクション、つまり SPY と GLD の両方を組み合わせたクロス セクションを選択する最良の方法は次のようなものです。

    df.xs(['SPY', 'GLD'], レベル=1)

?

4

4 に答える 4

21

Pandas の最近のバージョンでこれを行うより良い方法があります (バージョンの変更ログでスライサーを使用したマルチインデックスを0.14参照してください)。

regression_df.loc[(slice(None), ['SPY', 'GLD']), :]

これは、次を使用して読みやすくすることができますpd.IndexSlice

df.loc[pd.IndexSlice[:, ['SPY', 'GLD']], :]

慣例によりidx = pd.IndexSlice、これは次のようになります

df.loc[idx[:, ['SPY', 'GLD']], :]
于 2016-03-27T03:31:31.347 に答える
10

私は使用する以外にもっと直接的な方法を見つけることができませんでしたselect

>>> df

       last   tod
A SPY     1  1600
  SLV     2  1600
  GLD     3  1600

>>> df.select(lambda x: x[1] in ['SPY','GLD'])

       last   tod
A SPY     1  1600
  GLD     3  1600
于 2013-03-17T22:47:35.157 に答える
4

それが価値があるために、私は次のことをしました:

foo = pd.DataFrame(np.random.rand(12,3), 
                   index=pd.MultiIndex.from_product([['A','B','C','D'],['Green','Red','Blue']], 
                                                    names=['Letter','Color']),
                   columns=['X','Y','Z']).sort_index()

foo.reset_index()\
   .loc[foo.reset_index().Color.isin({'Green','Red'})]\
   .set_index(foo.index.names)

このアプローチは select に似ていますが、ラムダを使用してすべての行を反復することを回避します。

ただし、これをパネル アプローチと比較したところ、パネル ソリューションの方が高速であるように見えます (index/loc で 2.91 ミリ秒、to_panel/to_frame で 1.48 ミリ秒)。

foo.to_panel()[:,:,['Green','Red']].to_frame()

時間:

In [56]:
%%timeit
foo.reset_index().loc[foo.reset_index().Color.isin({'Green','Red'})].set_index(foo.index.names)
100 loops, best of 3: 2.91 ms per loop

In [57]:
%%timeit
foo2 = foo.reset_index()
foo2.loc[foo2.Color.eq('Green') | foo2.Color.eq('Red')].set_index(foo.index.names)
100 loops, best of 3: 2.85 ms per loop

In [58]:
%%timeit
foo2 = foo.reset_index()
foo2.loc[foo2.Color.ne('Blue')].set_index(foo.index.names)
100 loops, best of 3: 2.37 ms per loop

In [54]:
%%timeit
foo.to_panel()[:,:,['Green','Red']].to_frame()
1000 loops, best of 3: 1.18 ms per loop

アップデート

このトピックを (再び) 再検討した後、次のことに気付きました。

In [100]:
%%timeit
foo2 = pd.DataFrame({k: foo.loc[k] for k in foo.index if k[1] in ['Green','Red']}).transpose()
foo2.index.names = foo.index.names
foo2.columns.names = foo2.columns.names
100 loops, best of 3: 1.97 ms per loop

In [101]:
%%timeit
foo2 = pd.DataFrame.from_dict({k: foo.loc[k] for k in foo.index if k[1] in ['Green','Red']}, orient='index')
foo2.index.names = foo.index.names
foo2.columns.names = foo2.columns.names
100 loops, best of 3: 1.82 ms per loop

レベルの元の順序と名前を維持することを気にしない場合は、次を使用できます。

%%timeit
pd.concat({key: foo.xs(key, axis=0, level=1) for key in ['Green','Red']}, axis=0)
1000 loops, best of 3: 1.31 ms per loop

そして、最初のレベルで選択するだけの場合:

%%timeit
pd.concat({key: foo.loc[key] for key in ['A','B']}, axis=0, names=foo.index.names)
1000 loops, best of 3: 1.12 ms per loop

対:

%%timeit
foo.to_panel()[:,['A','B'],:].to_frame()
1000 loops, best of 3: 1.16 ms per loop

別のアップデート

例のインデックスを並べ替えると、foo上記の時間の多くが改善されます (時間は事前に並べ替えられたインデックスを反映するように更新されています)。ただし、インデックスがソートされている場合は、user674155 によって説明されているソリューションを使用できます。

%%timeit
foo.loc[(slice(None), ['Blue','Red']),:]
1000 loops, best of 3: 582 µs per loop

私の意見では、これが最も効率的で直感的です (ユーザーは、パネルと、パネルがフレームからどのように作成されるかを理解する必要はありません)。

注: インデックスがまだソートされていない場合でもfoo、オンザフライでのインデックスのソートは、to_panelオプションのパフォーマンスに匹敵します。

于 2016-02-25T20:05:24.967 に答える
1

パネルに変換すると、インデックスが直接作成されます

In [20]: df = pd.DataFrame(dict(time = pd.Timestamp('20130102'), 
                                A = np.random.rand(3), 
                 ticker=['SPY','SLV','GLD'])).set_index(['time','ticker'])

In [21]: df
Out[21]: 
                          A
time       ticker          
2013-01-02 SPY     0.347209
           SLV     0.034832
           GLD     0.280951

In [22]: p = df.to_panel()

In [23]: p
Out[23]: 
<class 'pandas.core.panel.Panel'>
Dimensions: 1 (items) x 1 (major_axis) x 3 (minor_axis)
Items axis: A to A
Major_axis axis: 2013-01-02 00:00:00 to 2013-01-02 00:00:00
Minor_axis axis: GLD to SPY

In [24]: p.ix[:,:,['SPY','GLD']]
Out[24]: 
<class 'pandas.core.panel.Panel'>
Dimensions: 1 (items) x 1 (major_axis) x 2 (minor_axis)
Items axis: A to A
Major_axis axis: 2013-01-02 00:00:00 to 2013-01-02 00:00:00
Minor_axis axis: SPY to GLD
于 2013-03-18T14:08:05.203 に答える