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
要求*複製*從原來的數據幀到一個新的數據幀的數據往往是任何操作DataFrame很大時會變慢。 'df.groupby(level = 0).filter(lambda x:len(x)> 1)'很慢,因爲它返回一個新的DataFrame,其數據從原始DataFrame中的任意位置複製而來。 'df.groupby(level = 0).size()> 1'相對較快,因爲它會生成一個更小的DataFrame - 不需要複製數據。使用布爾索引器來生成過濾的DataFrame不會節省時間,因爲*該步驟*將需要複製。 – unutbu
我沒有意識到它是如何工作的,謝謝!考慮到沒有真正的解決方案,關閉這個問題的正確方法是什麼? – jesseWUT
我沒有發表上述聲明作爲答案,因爲我無法證明它是真實的。也許這個問題是開放的,以防萬一我錯了。上面的評論要麼經得起時間的考驗,要麼挑戰某個人展現更快的方式。 – unutbu