要在列上使用“ str。”方法,可以重置索引,使用列“ str。”方法调用过滤行,然后重新创建索引。
In [72]: x = df.reset_index(); x[x.RPT_Date.str.endswith("0630")].set_index(['STK_ID', 'RPT_Date'])Out[72]: sales cogs net_pftSTK_ID RPT_Date 000876 20060630 857483000 729541000 67157200 20070630 1146245000 1050808000 113468500 20080630 1932470000 1777010000 133756300002254 20070630 501221000 289167000 118012200但是,这种方法并不是特别快。
In [73]: timeit x = df.reset_index(); x[x.RPT_Date.str.endswith("0630")].set_index(['STK_ID', 'RPT_Date'])1000 loops, best of 3: 1.78 ms per loop另一种方法基于一个事实,即MultiIndex对象的行为与元组列表非常相似。
In [75]: df.indexOut[75]: MultiIndex[('000876', '20060331') ('000876', '20060630') ('000876', '20060930') ('000876', '20061231') ('000876', '20070331') ('000876', '20070630') ('000876', '20070930') ('000876', '20071231') ('000876', '20080331') ('000876', '20080630') ('000876', '20080930') ('002254', '20061231') ('002254', '20070331') ('002254', '20070630') ('002254', '20070930')]在此基础上,您可以使用df.index.map()从MultiIndex创建一个布尔数组,然后使用结果过滤框架。
In [76]: df[df.index.map(lambda x: x[1].endswith("0630"))]Out[76]: sales cogs net_pftSTK_ID RPT_Date 000876 20060630 857483000 729541000 67157200 20070630 1146245000 1050808000 113468500 20080630 1932470000 1777010000 133756300002254 20070630 501221000 289167000 118012200这也相当快。
In [77]: timeit df[df.index.map(lambda x: x[1].endswith("0630"))]1000 loops, best of 3: 240 us per loop


