2016-10-05 8 views
8

मैं सूचकांक (year, foo), जहां मैं foo जहां year == someYear के एक्स सबसे बड़ा टिप्पणियों चयन करना चाहते हैं के साथ एक डेटा फ्रेम की आवश्यकता है।MultiIndex स्लाइसिंग सूचकांक पूरी तरह से lexsorted किए जाने की

मेरे दृष्टिकोण

df.sort_index(level=[0, 1], ascending=[1, 0], inplace=True) 
df.loc[pd.IndexSlice[2002, :10], :] 

था, लेकिन मैं

KeyError: 'MultiIndex Slicing requires the index to be fully lexsorted tuple len (2), lexsort depth (0)' 

मिल रहा छँटाई (जैसे ascending = [0, 0]) के अलग-अलग रूपों की कोशिश की, लेकिन वे सभी त्रुटि के कुछ प्रकार में हुई।

यदि मैं केवल xth पंक्ति चाहता था, मैं df.groupby(level=[0]).nth(x) छाँटने के बाद, लेकिन जब से मैं पंक्तियों का एक सेट करना चाहते हैं, कि काफी कुशल महसूस नहीं करता है हो सकता है।

इन पंक्तियों का चयन करने का सबसे अच्छा तरीका क्या है? कुछ डेटा के साथ खेलने के लिए:

    rank_int rank 
year foo       
2015 1.381845    2 320 
    1.234795    2 259 
    1.148488   199  2 
    0.866704    2 363 
    0.738022    2 319 
+0

क्या होता है यदि आप बस 'df.sort_index (inplace = True)' का उपयोग करके सॉर्ट करते हैं? – ASGM

+0

@ASGM यह काम करता है, लेकिन जब से मैं आरोही नहीं हूं, तो मुझे 'foo' का गलत समूह मिल जाएगा। – FooBar

उत्तर

0

दूसरे स्तर की xth टिप्पणियों प्राप्त करने के लिए के रूप में चाहते थे,: इस तरह से छँटाई का प्रयास करें

df.sort_index(level=[0, 1], ascending=[1, 0], inplace=True) 
df.loc[2015].iloc[:10] 

काम करता है के रूप में उम्मीद। यह अजीब इंडेक्स लॉकिंग w.r.t. का उत्तर नहीं देता है। हालांकि, lexsorting।

0

मेरे लिए यह sort_index(axis=1) का उपयोग करके काम किया:

df = df.sort_index(axis=1) 

एक बार जब आप ऐसा करते हैं, आप slice या pandas.IndexSlice, उपयोग कर सकते हैं जैसे:

df.loc[:, idx[:, 'A']] 
6

सबसे पहले आप इस तरह छँटाई करना चाहिए:

df.sort_index(level=['year','foo'], ascending=[1, 0], inplace=True) 

इसे KeyError को ठीक करना चाहिए। लेकिन df.loc[pd.IndexSlice[2002, :10], :] आपको वह परिणाम नहीं देगा जो आप उम्मीद कर रहे हैं। लोक फ़ंक्शन शून्य नहीं है और यह foo अनुक्रमणिका 0,1..9 में खोजने का प्रयास करेगा। मल्टीइंडेक्स का द्वितीयक स्तर इलोक का समर्थन नहीं करता है, मैं समूहबी का उपयोग करने का सुझाव दूंगा। आप पहले से ही इस multiindex है, तो आपको क्या करना चाहिए:

df.reset_index() 
df = df.sort_values(by=['year','foo'],ascending=[True,False]) 
df.groupby('year').head(10) 

आप की जरूरत n कम से कम foo के साथ प्रविष्टियों आप tail(n) उपयोग कर सकते हैं। यदि आपको पहले, तीसरी और पांचवीं प्रविष्टियों की आवश्यकता है, तो आप प्रश्न में उल्लिखित nth([0,2,4]) का उपयोग कर सकते हैं। मुझे लगता है कि यह ऐसा करने का सबसे प्रभावी तरीका है।

संबंधित मुद्दे