我有一个示例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 回答
你可以试试:
例:
如何在DataFrame.reindex中使用
level
参数?我参加派对的时间已经很晚了,但最可行和最直观的方法是使用
index.levels[n].isin
?它的工作原理如下:
我喜欢这种方法的是,命令实际上可以像英语句子一样阅读 .
附:在OP中,stk_list是一个字符串列表 . 一些list comprehension-fu将处理:
对我来说,只有当我从x中取出零如下时才有效:
get_level_values
: