如何通过检查列表中的子级索引值来过滤Pandas数据帧的行?

时间:2012-11-18 09:56:01

标签: python pandas

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

>>> 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的行,其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

基本上,我可以通过以下方式实现此样本数据的目标:

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

但我已经有了'STK_ID'和'我的应用程序数据框中的'RPT_Date',因此reset_index()将导致错误。无论如何,我想直接过滤索引而不是列。

从中学习:How to filter by sub-level index in 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()&来过滤Pandas数据帧的行? set_index()方法?

5 个答案:

答案 0 :(得分:11)

如何使用DataFrame.reindex中的level参数?

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

答案 1 :(得分: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

答案 2 :(得分: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

我喜欢这种方法,这个命令实际上可以像英文句子那样阅读。

P.S。在OP中,stk_list是一个字符串列表。一些list comprehension-fu将会解决这个问题:

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

答案 3 :(得分:1)

对我而言,只有当我从x中取出零时才有效:

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

答案 4 :(得分:0)

get_level_values

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