pandas 0.23 - 16. Reshaping and Pivot Tables

Reshaping और धुरी टेबल्स




pandas

Reshaping और धुरी टेबल्स

DataFrame ऑब्जेक्ट्स को पिवट करके रिहा करना

डेटा अक्सर सीएसवी फ़ाइलों या डेटाबेस में तथाकथित "स्टैक्ड" या "रिकॉर्ड" प्रारूप में संग्रहीत किया जाता है:

In [1]: df
Out[1]: 
         date variable     value
0  2000-01-03        A  0.469112
1  2000-01-04        A -0.282863
2  2000-01-05        A -1.509059
3  2000-01-03        B -1.135632
4  2000-01-04        B  1.212112
5  2000-01-05        B -0.173215
6  2000-01-03        C  0.119209
7  2000-01-04        C -1.044236
8  2000-01-05        C -0.861849
9  2000-01-03        D -2.104569
10 2000-01-04        D -0.494929
11 2000-01-05        D  1.071804

जिज्ञासु के लिए यहां बताया गया है कि उपरोक्त DataFrame कैसे बनाया गया था:

import pandas.util.testing as tm; tm.N = 3
def unpivot(frame):
    N, K = frame.shape
    data = {'value' : frame.values.ravel('F'),
            'variable' : np.asarray(frame.columns).repeat(N),
            'date' : np.tile(np.asarray(frame.index), K)}
    return pd.DataFrame(data, columns=['date', 'variable', 'value'])
df = unpivot(tm.makeTimeDataFrame())

चर A लिए सब कुछ का चयन करने के लिए हम कर सकते हैं:

In [2]: df[df['variable'] == 'A']
Out[2]: 
        date variable     value
0 2000-01-03        A  0.469112
1 2000-01-04        A -0.282863
2 2000-01-05        A -1.509059
_images / reshaping_pivot.png

लेकिन मान लीजिए कि हम चर के साथ समय श्रृंखला संचालन करना चाहते हैं। एक बेहतर प्रतिनिधित्व वह स्थान होगा जहां columns अद्वितीय चर होते हैं और तिथियों का एक index व्यक्तिगत टिप्पणियों की पहचान करता है। इस रूप में डेटा को फिर से देखने के लिए, हम DataFrame.pivot() विधि का उपयोग करते हैं DataFrame.pivot() एक शीर्ष स्तर के कार्य pivot() रूप में भी लागू किया जाता है):

In [3]: df.pivot(index='date', columns='variable', values='value')
Out[3]: 
variable           A         B         C         D
date                                              
2000-01-03  0.469112 -1.135632  0.119209 -2.104569
2000-01-04 -0.282863  1.212112 -1.044236 -0.494929
2000-01-05 -1.509059 -0.173215 -0.861849  1.071804

यदि values तर्क को छोड़ दिया जाता है, और इनपुट DataFrame में मानों का एक से अधिक स्तंभ होता है जो कि pivot लिए स्तंभ या अनुक्रमणिका इनपुट के रूप में उपयोग नहीं किया जाता है, तो परिणामी "pivoted" DataFrame में पदानुक्रमित कॉलम होंगे जिनके शीर्ष स्तर संबंधित मान स्तंभ को इंगित करता है:

In [4]: df['value2'] = df['value'] * 2

In [5]: pivoted = df.pivot('date', 'variable')

In [6]: pivoted
Out[6]: 
               value                                  value2                              
variable           A         B         C         D         A         B         C         D
date                                                                                      
2000-01-03  0.469112 -1.135632  0.119209 -2.104569  0.938225 -2.271265  0.238417 -4.209138
2000-01-04 -0.282863  1.212112 -1.044236 -0.494929 -0.565727  2.424224 -2.088472 -0.989859
2000-01-05 -1.509059 -0.173215 -0.861849  1.071804 -3.018117 -0.346429 -1.723698  2.143608

तब आप DataFrame से दिए गए सबसेट का चयन कर सकते हैं:

In [7]: pivoted['value2']
Out[7]: 
variable           A         B         C         D
date                                              
2000-01-03  0.938225 -2.271265  0.238417 -4.209138
2000-01-04 -0.565727  2.424224 -2.088472 -0.989859
2000-01-05 -3.018117 -0.346429 -1.723698  2.143608

ध्यान दें कि यह उस मामले में अंतर्निहित डेटा पर एक दृश्य देता है जहां डेटा सजातीय-टाइप किया गया है।

स्टैकिंग और अनस्टैकिंग द्वारा रीसेट करना

_images / reshaping_stack.png

DataFrame.pivot() विधि से निकटता से संबंधित stack() और unstack() Series और DataFrame पर उपलब्ध तरीके हैं। इन विधियों को MultiIndex ऑब्जेक्ट्स के साथ मिलकर काम करने के लिए डिज़ाइन किया गया है ( पदानुक्रमित अनुक्रमण पर अनुभाग देखें)। यहाँ अनिवार्य रूप से ये तरीके क्या करते हैं:

  • stack : "पिवट" (संभवतः पदानुक्रमित) स्तंभ लेबल का एक स्तर, एक DataFrame को नए आंतरिक-पंक्ति स्तर के सबसे नए सूचकांक के साथ DataFrame
  • unstack : ( stack का उलटा संचालन) "धुरी" स्तंभ अक्ष के लिए (संभवतः पदानुक्रमित) पंक्ति सूचकांक का एक स्तर, एक नया आंतरिक-स्तंभ स्तर के नए लेबल के साथ एक पुनर्निर्मित DataFrame उत्पादन करता है।
_images / reshaping_unstack.png

उदाहरण के द्वारा स्पष्ट करने का सबसे स्पष्ट तरीका है। आइए पदानुक्रमित अनुक्रमणिका अनुभाग से एक पूर्व उदाहरण डेटा सेट लें:

In [8]: tuples = list(zip(*[['bar', 'bar', 'baz', 'baz',
   ...:                      'foo', 'foo', 'qux', 'qux'],
   ...:                     ['one', 'two', 'one', 'two',
   ...:                      'one', 'two', 'one', 'two']]))
   ...: 

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

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

In [11]: df2 = df[:4]

In [12]: df2
Out[12]: 
                     A         B
first second                    
bar   one     0.721555 -0.706771
      two    -1.039575  0.271860
baz   one    -0.424972  0.567020
      two     0.276232 -1.087401

stack फ़ंक्शन DataFrame लिए DataFrame के कॉलम में एक स्तर को "कंप्रेस" करता है:

  • एक Series , एक साधारण कॉलम इंडेक्स के मामले में।
  • स्तंभों में एक MultiIndex के मामले में एक MultiIndex

यदि कॉलम में MultiIndex , तो आप चुन सकते हैं कि किस स्तर पर स्टैक करना है। स्टैक्ड स्तर कॉलम पर एक MultiIndex में नया न्यूनतम स्तर बन जाता है:

In [13]: stacked = df2.stack()

In [14]: stacked
Out[14]: 
first  second   
bar    one     A    0.721555
               B   -0.706771
       two     A   -1.039575
               B    0.271860
baz    one     A   -0.424972
               B    0.567020
       two     A    0.276232
               B   -1.087401
dtype: float64

"स्टैक्ड" DataFrame या Series ( index रूप में एक MultiIndex होने) के साथ, stack का उलटा संचालन unstack , जो डिफ़ॉल्ट रूप से पिछले स्तर को अनस्टैक्स करता है :

In [15]: stacked.unstack()
Out[15]: 
                     A         B
first second                    
bar   one     0.721555 -0.706771
      two    -1.039575  0.271860
baz   one    -0.424972  0.567020
      two     0.276232 -1.087401

In [16]: stacked.unstack(1)