8

df我有一个具有多级索引的示例 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_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() 会导致错误。无论如何,我想直接过滤索引而不是列。

从中学习:如何在 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()

4

5 回答 5

11

使用level参数 inDataFrame.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 回答
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 回答
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

我喜欢这种方法的地方在于,该命令实际上可以像英语句子一样阅读。

ps 在 OP 中,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 回答