How to filter rows of Pandas dataframe by checking whether sub-level index value within a list?
我有一个熊猫数据框
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 |
其中
我想得到
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()将导致错误。无论如何,我想直接根据索引而不是列进行筛选。
从中学习:如何按大熊猫的次级指数筛选
我试过
我的问题是:在不使用
您可以尝试:
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 |
在
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 |
我参加聚会已经很晚了,但要做到这一点,最易读和最直观的方法肯定是使用
工作原理如下:
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)] |
。
1 | df[df.index.get_level_values(level = 0).isin(stk_list)] |
。