pandas 0.23 - 11. MultiIndex / Advanced Indexing

मल्टीआंडेक्स / एडवांस्ड इंडेक्सिंग




pandas

मल्टीआंडेक्स / एडवांस्ड इंडेक्सिंग

यह खंड एक MultiIndex और अधिक उन्नत अनुक्रमण सुविधाओं के साथ अनुक्रमण को शामिल करता है।

सामान्य अनुक्रमण प्रलेखन के लिए अनुक्रमण और चयन डेटा देखें।

चेतावनी

एक सेटिंग ऑपरेशन के लिए एक प्रतिलिपि या एक संदर्भ लौटाया जाता है, संदर्भ पर निर्भर हो सकता है। इसे कभी-कभी chained assignment कहा जाता है और इसे टाला जाना चाहिए। प्रतिलिपि बनाम एक दृश्य लौटना देखें

कुछ उन्नत रणनीतियों के लिए cookbook की cookbook देखें।

पदानुक्रमित अनुक्रमण (MultiIndex)

पदानुक्रमित / बहु-स्तरीय अनुक्रमण बहुत रोमांचक है क्योंकि यह कुछ काफी परिष्कृत डेटा विश्लेषण और हेरफेर के लिए द्वार खोलता है, विशेष रूप से उच्च आयामी डेटा के साथ काम करने के लिए। संक्षेप में, यह आपको श्रृंखला (1d) और डेटाफ़्रेम (2d) जैसे कम आयामी डेटा संरचनाओं में आयामों की एक अनियंत्रित संख्या के साथ डेटा को संग्रहीत और हेरफेर करने में सक्षम बनाता है।

इस खंड में, हम दिखाते हैं कि वास्तव में "पदानुक्रमित" अनुक्रमण से हमारा क्या मतलब है और यह उपरोक्त वर्णित सभी पंडों की अनुक्रमण कार्यक्षमता के साथ और पूर्व खंडों में कैसे एकीकृत करता है। बाद में, जब समूह द्वारा डेटा की धुरी और पुन: स्थापन पर चर्चा की जाती है , तो हम विश्लेषण के लिए डेटा को संरचित करने के तरीके के बारे में बताने के लिए गैर-तुच्छ अनुप्रयोग दिखाएंगे।

कुछ उन्नत रणनीतियों के लिए cookbook की cookbook देखें।

MultiIndex (hierarchical index) ऑब्जेक्ट बनाना

MultiIndex ऑब्जेक्ट मानक Index ऑब्जेक्ट का पदानुक्रमित एनालॉग है जो आम तौर पर पांडा ऑब्जेक्ट्स में अक्ष लेबल को संग्रहीत करता है। आप MultiIndex को MultiIndex एक सरणी के रूप में सोच सकते हैं जहां प्रत्येक ट्यूपल अद्वितीय है। एक MultiIndex को सरणियों की सूची ( MultiIndex.from_arrays का उपयोग MultiIndex.from_arrays ), ट्यूपल्स की एक सरणी ( MultiIndex.from_tuples का उपयोग MultiIndex.from_tuples ) या पुनरावृत्तियों के एक पार सेट ( MultiIndex.from_product का उपयोग MultiIndex.from_product ) बनाया जा सकता है। Index कंस्ट्रक्टर एक MultiIndex को वापस करने का प्रयास करेगा जब यह ट्यूपल्स की एक सूची पारित हो जाएगा। निम्नलिखित उदाहरण MultiIndexes को इनिशियलाइज़ करने के विभिन्न तरीकों को प्रदर्शित करते हैं।

In [1]: arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
   ...:           ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
   ...: 

In [2]: tuples = list(zip(*arrays))

In [3]: tuples
Out[3]: 
[('bar', 'one'),
 ('bar', 'two'),
 ('baz', 'one'),
 ('baz', 'two'),
 ('foo', 'one'),
 ('foo', 'two'),
 ('qux', 'one'),
 ('qux', 'two')]

In [4]: index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])

In [5]: index
Out[5]: 
MultiIndex(levels=[['bar', 'baz', 'foo', 'qux'], ['one', 'two']],
           labels=[[0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 0, 1, 0, 1, 0, 1]],
           names=['first', 'second'])

In [6]: s = pd.Series(np.random.randn(8), index=index)

In [7]: s
Out[7]: 
first  second
bar    one       0.469112
       two      -0.282863
baz    one      -1.509059
       two      -1.135632
foo    one       1.212112
       two      -0.173215
qux    one       0.119209
       two      -1.044236
dtype: float64

जब आप प्रत्येक तत्वों को दो पुनरावृत्तियों में बाँधना चाहते हैं, तो MultiIndex.from_product फ़ंक्शन का उपयोग करना आसान हो सकता है:

In [8]: iterables = [['bar', 'baz', 'foo', 'qux'], ['one', 'two']]

In [9]: pd.MultiIndex.from_product(iterables, names=['first', 'second'])
Out[9]: 
MultiIndex(levels=[['bar', 'baz', 'foo', 'qux'], ['one', 'two']],
           labels=[[0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 0, 1, 0, 1, 0, 1]],
           names=['first', 'second'])

एक सुविधा के रूप में, आप स्वचालित रूप से एक मल्टीइन्डेक्स के निर्माण के लिए सीधे श्रृंखला या डेटाफ़्रेम में सरणियों की एक सूची पारित कर सकते हैं:

In [10]: arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),
   ....:           np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])]
   ....: 

In [11]: s = pd.Series(np.random.randn(8), index=arrays)

In [12]: s
Out[12]: 
bar  one   -0.861849
     two   -2.104569
baz  one   -0.494929
     two    1.071804
foo  one    0.721555
     two   -0.706771
qux  one   -1.039575
     two    0.271860
dtype: float64

In [13]: df = pd.DataFrame(np.random.randn(8, 4), index=arrays)

In [14]: df
Out[14]: 
                0         1         2         3
bar one -0.424972  0.567020  0.276232 -1.087401
    two -0.673690  0.113648 -1.478427  0.524988
baz one  0.404705  0.577046 -1.715002 -1.039268
    two -0.370647 -1.157892 -1.344312  0.844885
foo one  1.075770 -0.109050  1.643563 -1.469388
    two  0.357021 -0.674600 -1.776904 -0.968914
qux one -1.294524  0.413738  0.276662 -0.472035
    two -0.013960 -0.362543 -0.006154 -0.923061

MultiIndex सभी निर्माता एक names तर्क को स्वीकार करते हैं जो स्वयं स्तरों के लिए स्ट्रिंग नामों को संग्रहीत करता है। यदि कोई नाम प्रदान None किया जाता है, तो None भी सौंपा None जाएगा:

In [15]: df.index.names
Out[15]: FrozenList([None, None])

यह सूचकांक किसी पांडा वस्तु के किसी भी अक्ष को वापस कर सकता है, और सूचकांक के स्तर की संख्या आपके ऊपर है:

In [16]: df = pd.DataFrame(np.random.randn(3, 8), index=['A', 'B', 'C'], columns=index)

In [17]: df
Out[17]: 
first        bar                 baz                 foo                 qux          
second       one       two       one       two       one       two       one       two
A       0.895717  0.805244 -1.206412  2.565646  1.431256  1.340309 -1.170299 -0.226169
B       0.410835  0.813850  0.132003 -0.827317 -0.076467 -1.187678  1.130127 -1.436737
C      -1.413681  1.607920  1.024180  0.569605  0.875906 -2.211372  0.974466 -2.006747

In [18]: pd.DataFrame(np.random.randn(6, 6), index=index[:6], columns=index[:6])