對於什麼是值得的,我做的以下內容:
foo = pd.DataFrame(np.random.rand(12,3),
index=pd.MultiIndex.from_product([['A','B','C','D'],['Green','Red','Blue']],
names=['Letter','Color']),
columns=['X','Y','Z']).sort_index()
foo.reset_index()\
.loc[foo.reset_index().Color.isin({'Green','Red'})]\
.set_index(foo.index.names)
該方法與select類似,但避免使用lambda迭代所有行。
不過,我比較這對小組的做法,它出現在面板解決方案更快(2.91毫秒指數/ LOC VS 1.48毫秒to_panel/to_frame:
foo.to_panel()[:,:,['Green','Red']].to_frame()
時報:
In [56]:
%%timeit
foo.reset_index().loc[foo.reset_index().Color.isin({'Green','Red'})].set_index(foo.index.names)
100 loops, best of 3: 2.91 ms per loop
In [57]:
%%timeit
foo2 = foo.reset_index()
foo2.loc[foo2.Color.eq('Green') | foo2.Color.eq('Red')].set_index(foo.index.names)
100 loops, best of 3: 2.85 ms per loop
In [58]:
%%timeit
foo2 = foo.reset_index()
foo2.loc[foo2.Color.ne('Blue')].set_index(foo.index.names)
100 loops, best of 3: 2.37 ms per loop
In [54]:
%%timeit
foo.to_panel()[:,:,['Green','Red']].to_frame()
1000 loops, best of 3: 1.18 ms per loop
UPDATE
重溫這個話題(再次)後,我觀察到以下:
In [100]:
%%timeit
foo2 = pd.DataFrame({k: foo.loc[k] for k in foo.index if k[1] in ['Green','Red']}).transpose()
foo2.index.names = foo.index.names
foo2.columns.names = foo2.columns.names
100 loops, best of 3: 1.97 ms per loop
In [101]:
%%timeit
foo2 = pd.DataFrame.from_dict({k: foo.loc[k] for k in foo.index if k[1] in ['Green','Red']}, orient='index')
foo2.index.names = foo.index.names
foo2.columns.names = foo2.columns.names
100 loops, best of 3: 1.82 ms per loop
如果你不關心保留原來的秩序和層次的命名,你可以使用:
%%timeit
pd.concat({key: foo.xs(key, axis=0, level=1) for key in ['Green','Red']}, axis=0)
1000 loops, best of 3: 1.31 ms per loop
如果你只是在第一級選擇:
%%timeit
pd.concat({key: foo.loc[key] for key in ['A','B']}, axis=0, names=foo.index.names)
1000 loops, best of 3: 1.12 ms per loop
與:
%%timeit
foo.to_panel()[:,['A','B'],:].to_frame()
1000 loops, best of 3: 1.16 ms per loop
另一個更新
如果您對示例foo
的索引進行排序,以上許多時間都會改進(時間已更新以反映預先排序的索引)。然而,當指數進行排序,你可以使用user674155描述的解決方案:
%%timeit
foo.loc[(slice(None), ['Blue','Red']),:]
1000 loops, best of 3: 582 µs per loop
這是最有效,最直觀的在我看來(用戶並不需要了解面板和它們是如何從創建幀)。
注意:即使索引尚未排序,動態排序foo
的索引在性能上與to_panel
選項的性能相當。
不錯,這可能是最簡單的方法。我想知道它是否是最有效的,因爲爲每一行調用lambda可能會很慢,但是我不確定在當前版本 – 2013-03-19 02:56:18
中有沒有更快的方法看到上面的面板解決方案?選擇是否對任何一種非平凡的框架都非常低效 – Jeff 2013-03-19 21:49:39
確實面板更有意義,速度也更快。謝謝! – 2013-03-24 20:33:25