क्या इसके लायक है के लिए है, मैंने किया था निम्नलिखित:
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)
यह दृष्टिकोण चुनने के समान है, लेकिन लैम्ब्डा के साथ सभी पंक्तियों पर पुनरावृत्ति से बचाता है।
हालांकि, मैं पैनल दृष्टिकोण को यह तुलना में, और ऐसा लगता है पैनल समाधान तेजी से (सूचकांक के लिए 2.91 एमएस/loc to_panel/to_frame के लिए 1.48 एमएस बनाम है:
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
0123:
अद्यतन
इस विषय (फिर) की समीक्षा के बाद, मैं निम्नलिखित मनाया
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
विकल्प के प्रदर्शन में तुलनीय है।
regression_df.loc[(slice(None), ['SPY', 'GLD']), :]
यह दृष्टिकोण की आवश्यकता है कि सूचकांक कोषगत अनुसार क्रमबद्ध हो (df.sort_index()
का उपयोग करें):
अच्छा, यह शायद सबसे आसान तरीका है। मुझे आश्चर्य है कि यह सबसे कुशल है, हालांकि प्रत्येक पंक्ति के लिए लैम्ब्डा को कॉल करना धीमा हो सकता है, लेकिन फिर मुझे यकीन नहीं है कि मौजूदा संस्करण –
में एक तेज़ तरीका है या नहीं, क्या आप उपरोक्त पैनल समाधान देखते हैं? अगर किसी भी तरह के गैर-तुच्छ फ्रेम – Jeff
के लिए बहुत अक्षम है तो वास्तव में पैनल अधिक समझ में आता है, और बहुत तेज़ है। धन्यवाद! –