Python 如何通过检查列表中的子级别索引值来筛选数据帧的行?

Python 如何通过检查列表中的子级别索引值来筛选数据帧的行?,python,pandas,Python,Pandas,我有一个示例数据帧df,它具有多级索引: >>> 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

我有一个示例数据帧
df
,它具有多级索引:

>>> 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']

我想获取
df
的行,其子级索引
STK\u ID
的值在
STK\u列表中。输出如下:

                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_列表))]
,Pandas 0.8.1给出了
属性错误:“unicode”对象没有属性“isin”


我的问题:如果不使用
reset\u index()
&
set\u index()
方法,我应该如何通过检查列表中的子级别索引值来过滤Pandas数据帧的行?

在中使用
level
参数如何

您可以尝试:

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

我参加聚会已经很晚了,但最具可读性和直观性的方法肯定是使用
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
我喜欢这种方法的地方在于,命令实际上可以像英语句子一样阅读

p、 在OP中,stk_列表是一个字符串列表。下面是一个列表:

df[df.index.levels[0].isin([int(i) for i in stk_list])]

对我来说,只有当我从x中取零时,它才起作用,如下所示:

a[a.index.map(lambda x: x in b)]

获取级别值

df[df.index.get_level_values(level = 0).isin(stk_list)]

df[df.index.map(stk_列表中的lambda x:x[0])
?@hayden:嗯,我想我应该:)。这是版本控制吗?这对我不起作用,而df[df.index.isin(stk_列表,.level=0)]起作用。当然了。前面的关卡不应该在那里。
df[df.index.get_level_values(level = 0).isin(stk_list)]