2016-09-14 59 views
3

如果我有这样的数据帧获取多指标熊猫数据框的子集单指标布尔索引

import pandas as pd 
tuples_index = [(1,1990), (2,1999), (2,2002), (3,1992), (3,1994), (3,1996)] 
index = pd.MultiIndex.from_tuples(tuples_index, names=['id', 'FirstYear']) 
df = pd.DataFrame([2007, 2006, 2006, 2000, 2000, 2000], index=index, columns=['LastYear']) 

df 
Out[2]: 
       LastYear 
id FirstYear   
1 1990   2007 
2 1999   2006 
    2002   2006 
3 1992   2000 
    1994   2000 
    1996   2000 

,我想获得的数据帧的一个子集,其中基于ID的组是长于一个,我能做到这一点,但它的速度慢:

%timeit df.groupby(level=0).filter(lambda x: len(x) > 1) 
1000 loops, best of 3: 1.36 ms per loop 

我DF有几千万行和群体数量庞大,以及(大部分群体是LEN 1),这样的时间加起来。我可以更快地取得布林索引是这样的:

%timeit df.groupby(level=0).size() > 1 
1000 loops, best of 3: 364 µs per loop 

但布尔索引只有ID作为其索引:

id 
1 False 
2  True 
3  True 

我想也许我给更多的背景不是必须的,但如何我可以使用带有单个索引的布尔型索引器来从具有MultiIndex的数据框中获取子集吗?所需的输出将是:

   LastYear 
id FirstYear   
2 1999   2006 
    2002   2006 
3 1992   2000 
    1994   2000 
    1996   2000 
+1

要求*复制*从原来的数据帧到一个新的数据帧的数据往往是任何操作DataFrame很大时会变慢。 'df.groupby(level = 0).filter(lambda x:len(x)> 1)'很慢,因为它返回一个新的DataFrame,其数据从原始DataFrame中的任意位置复制而来。 'df.groupby(level = 0).size()> 1'相对较快,因为它会生成一个更小的DataFrame - 不需要复制数据。使用布尔索引器来生成过滤的DataFrame不会节省时间,因为*该步骤*将需要复制。 – unutbu

+0

我没有意识到它是如何工作的,谢谢!考虑到没有真正的解决方案,关闭这个问题的正确方法是什么? – jesseWUT

+0

我没有发表上述声明作为答案,因为我无法证明它是真实的。也许这个问题是开放的,以防万一我错了。上面的评论要么经得起时间的考验,要么挑战某个人展现更快的方式。 – unutbu

回答

0

使用groupbytransform建立一个面具

df[df.groupby(level=0).transform(np.size).gt(1).values] 

enter image description here

相关问题