2016-09-14 104 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

相關問題