首页 文章

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

提问于
浏览
7

我有一个示例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()set_index() 方法来过滤Pandas数据帧的行?

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
    
  • 8

    如何在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

    我参加派对的时间已经很晚了,但最可行和最直观的方法是使用 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中,stk_list是一个字符串列表 . 一些list comprehension-fu将处理:

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

    对我来说,只有当我从x中取出零如下时才有效:

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

    get_level_values

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

相关问题