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

How to filter rows of Pandas dataframe by checking whether sub-level index value within a list?

我有一个熊猫数据框df的样本,它有多个级别的索引:

1
2
3
4
5
6
7
8
9
>>> 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_ID的值在stk_list之内。输出如下:

1
2
3
4
5
                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

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

1
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_list))],熊猫0.8.1给了AttributeError: 'unicode' object has no attribute 'isin'

我的问题是:在不使用reset_index()&set_index()方法的情况下,如何通过检查列表中的子级索引值来筛选熊猫数据帧的行?


您可以尝试:

1
df[df.index.map(lambda x: x[0] in stk_list)]

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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


我参加聚会已经很晚了,但要做到这一点,最易读和最直观的方法肯定是使用index.levels[n].isin

工作原理如下:

1
2
3
4
5
6
7
>>> 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

我喜欢这种方法的原因是命令实际上可以像英语句子一样被阅读。

另外,在操作中,stk_列表是字符串列表。有点清单理解,傅会处理:

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


对我来说,只有当我把x中的0取出来时,它才起作用,如下所示:

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


get_level_values号:

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