8

dfmulti_levelインデックスを持つサンプルのPandasデータフレームがあります。

>>> df
                STK_Name   ROIC   mg_r
STK_ID RPT_Date                       
002410 20111231      ???  0.401  0.956
300204 20111231      ???  0.375  0.881
300295 20111231     ????  2.370  0.867
300288 20111231     ????  1.195  0.861
600106 20111231     ????  1.214  0.857
300113 20111231     ????  0.837  0.852

stk_list定義されていますstk_list = ['600106','300204','300113']

dfsub_levelindexの値STK_IDが内にある行を取得したいstk_list。出力は次のとおりです。

                STK_Name   ROIC   mg_r
STK_ID RPT_Date                       
300204 20111231      ???  0.375  0.881
600106 20111231     ????  1.214  0.857
300113 20111231     ????  0.837  0.852

基本的に、このサンプルデータの目標は次の方法で達成できます。

df = df.reset_index() ; df[df.STK_ID.isin(stk_list)]

ただし、アプリケーションデータフレームにはすでに「STK_ID」と「RPT_Date」の列があるため、reset_index()でエラーが発生します。とにかく、列ではなくインデックスに対して直接フィルタリングしたいと思います。

これから学ぶ:パンダのサブレベルインデックスでフィルタリングする方法

試してみるとdf[df.index.map(lambda x: x[0].isin(stk_list))]、Pandas 0.8.1はAttributeError: 'unicode' object has no attribute 'isin'

reset_index()私の質問: &set_index()メソッドを使用せずにリスト内のサブレベルのインデックス値をチェックすることにより、Pandasデータフレームの行をどのようにフィルタリングする必要がありますか?

4

5 に答える 5

11

あなたが試すことができます:

df[df.index.map(lambda x: x[0] in stk_list)]

例:

In : stk_list
Out: ['600106', '300204', '300113']

In : df
Out:
                STK_Name   ROIC   mg_r
STK_ID RPT_Date
002410 20111231      ???  0.401  0.956
300204 20111231      ???  0.375  0.881
300295 20111231     ????  2.370  0.867
300288 20111231     ????  1.195  0.861
600106 20111231     ????  1.214  0.857
300113 20111231     ????  0.837  0.852

In : df[df.index.map(lambda x: x[0] in stk_list)]
Out:
                STK_Name   ROIC   mg_r
STK_ID RPT_Date
300204 20111231      ???  0.375  0.881
600106 20111231     ????  1.214  0.857
300113 20111231     ????  0.837  0.852
于 2012-11-19T11:48:31.853 に答える
11

levelでパラメータを使用してみDataFrame.reindexませんか?

In [14]: df
Out[14]: 
            0         1
a 0  0.007288 -0.840392
  1  0.652740  0.597250
b 0 -1.197735  0.822150
  1 -0.242030 -0.655058

In [15]: stk_list = ['a']

In [16]: df.reindex(stk_list, level=0)
Out[16]: 
            0         1
a 0  0.007288 -0.840392
  1  0.652740  0.597250
于 2012-11-19T04:26:44.540 に答える
8

私はパーティーにかなり遅れていますが、これを行うための最も読みやすく直感的な方法は、確かに使用することindex.levels[n].isinです。

それはこのように動作します:

>>> stk_list = [600106, 300204, 300113]
>>> df[df.index.levels[0].isin(stk_list)]
                STK_Name   ROIC   mg_r
STK_ID RPT_Date                       
300204 20111231      ???  0.375  0.881
300295 20111231     ????  2.370  0.867
300113 20111231     ????  0.837  0.852

このアプローチで私が気に入っているのは、コマンドが事実上英語の文章のように読めることです。

OPのpsの場合、stk_listは文字列のリストです。リスト内包表記のビ​​ット-fuはそれを扱います:

df[df.index.levels[0].isin([int(i) for i in stk_list])]
于 2015-07-13T13:00:47.017 に答える
1

私にとっては、次のようにxからゼロを取り出した場合にのみ機能しました。

a[a.index.map(lambda x: x in b)]
于 2016-04-23T18:00:34.203 に答える
0

get_level_values

df[df.index.get_level_values(level = 0).isin(stk_list)]
于 2017-01-25T20:58:36.057 に答える