我有一个df带有multi_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
Run Code Online (Sandbox Code Playgroud)
并被stk_list定义为stk_list = ['600106','300204','300113']
我想要得到的行df,其sub_level指数的值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
Run Code Online (Sandbox Code Playgroud)
基本上,我可以通过以下方式实现此示例数据的目标:
df = df.reset_index() ; df[df.STK_ID.isin(stk_list)]
Run Code Online (Sandbox Code Playgroud)
但是我的应用程序数据帧中已经有"STK_ID"和"RPT_Date"列,因此reset_index()会导致错误.无论如何,我想直接过滤索引而不是列.
从中学习:如何按Pandas中的子级索引进行过滤
我试试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数据帧的行?
Cha*_*She 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
Run Code Online (Sandbox Code Playgroud)
Ava*_*ris 11
你可以试试:
df[df.index.map(lambda x: x[0] in stk_list)]
Run Code Online (Sandbox Code Playgroud)
例:
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
Run Code Online (Sandbox Code Playgroud)
我参加派对的时间已经很晚了,但是最可行和最直观的方法就是使用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
Run Code Online (Sandbox Code Playgroud)
我喜欢这种方法的是,命令实际上可以像英语句子一样阅读.
在OP中,ps,stk_list是一个字符串列表.一些list comprehension-fu将处理:
df[df.index.levels[0].isin([int(i) for i in stk_list])]
Run Code Online (Sandbox Code Playgroud)