pandas 0.23 - 14. Group By: split-apply-combine

समूह द्वारा: विभाजन-लागू-गठबंधन




pandas

समूह द्वारा: विभाजन-लागू-गठबंधन

"समूह द्वारा" द्वारा हम निम्नलिखित चरणों में से एक या अधिक को शामिल करने की प्रक्रिया का उल्लेख कर रहे हैं:

  • कुछ मानदंडों के आधार पर डेटा को समूहों में विभाजित करना।
  • प्रत्येक समूह को स्वतंत्र रूप से एक फ़ंक्शन लागू करना
  • परिणामों को डेटा संरचना में संयोजित करना।

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

  • एकत्रीकरण : प्रत्येक समूह के लिए एक सारांश आँकड़ा (या आँकड़े) की गणना करें। कुछ उदाहरण:

    • गणना समूह रकम या साधन।
    • गणना समूह आकार / मायने रखता है।
  • परिवर्तन : कुछ समूह-विशिष्ट संगणनाएँ करते हैं और एक समान अनुक्रमित वस्तु को लौटाते हैं। कुछ उदाहरण:

    • एक समूह के भीतर डेटा (zscore) को मानकीकृत करें।
    • प्रत्येक समूह से प्राप्त मूल्य वाले समूहों के भीतर NAs भरना।
  • निस्पंदन : समूह-वार गणना के अनुसार कुछ समूहों को छोड़ दें, जो सही या गलत का मूल्यांकन करता है। कुछ उदाहरण:

    • केवल कुछ सदस्यों वाले समूहों से संबंधित डेटा को त्यागें।
    • समूह योग या माध्य के आधार पर डेटा को फ़िल्टर करें।
  • उपरोक्त में से कुछ संयोजन: GroupBy लागू चरण के परिणामों की जांच करेगा और एक समझदारी से संयुक्त परिणाम को वापस करने की कोशिश करेगा यदि यह उपरोक्त दोनों श्रेणियों में से किसी में भी फिट नहीं होता है।

चूंकि पांडा डेटा संरचनाओं पर ऑब्जेक्ट इंस्टेंस विधियों का सेट आम तौर पर समृद्ध और अभिव्यंजक होता है, इसलिए हम प्रायः प्रत्येक समूह पर डेटाफ़्रेम फ़ंक्शन को लागू करना चाहते हैं। GroupBy नाम उन लोगों के लिए काफी परिचित होना चाहिए जिन्होंने SQL- आधारित टूल (या itertools ) का उपयोग किया है, जिसमें आप निम्न कोड लिख सकते हैं:

SELECT Column1, Column2, mean(Column3), sum(Column4)
FROM SomeTable
GROUP BY Column1, Column2

हम पांडा का उपयोग करके इस प्राकृतिक और आसान एक्सप्रेस की तरह संचालन करना चाहते हैं। हम GroupBy कार्यक्षमता के प्रत्येक क्षेत्र को संबोधित करेंगे फिर कुछ गैर-तुच्छ उदाहरण / उपयोग के मामले प्रदान करेंगे।

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

किसी वस्तु को समूहों में विभाजित करना

पांडा वस्तुओं को उनके किसी भी कुल्हाड़ी पर विभाजित किया जा सकता है। समूहीकरण की सार परिभाषा समूह के नामों को लेबल की एक मानचित्रण प्रदान करना है। GroupBy ऑब्जेक्ट बनाने के लिए (GroupBy ऑब्जेक्ट बाद में क्या है पर अधिक), आप निम्न कार्य कर सकते हैं:

# default is axis=0
>>> grouped = obj.groupby(key)
>>> grouped = obj.groupby(key, axis=1)
>>> grouped = obj.groupby([key1, key2])

मानचित्रण को कई अलग-अलग तरीकों से निर्दिष्ट किया जा सकता है:

  • अक्ष लेबल के प्रत्येक पर बुलाया जाने वाला पायथन फ़ंक्शन।
  • चयनित अक्ष के रूप में एक ही लंबाई की एक सूची या NumPy सरणी।
  • एक तानाशाही या Series , एक label -> group name प्रदान करना label -> group name मानचित्रण।
  • DataFrame ऑब्जेक्ट्स के लिए, एक स्ट्रिंग जो समूह के लिए उपयोग किए जाने वाले एक कॉलम को दर्शाता है। बेशक df.groupby('A') केवल df.groupby(df['A']) लिए सिंटैक्टिक शुगर है, लेकिन यह जीवन को सरल बनाता है।
  • DataFrame ऑब्जेक्ट्स के लिए, एक स्ट्रिंग जो इंडेक्स स्तर को समूह के लिए उपयोग करने का संकेत देती है।
  • उपरोक्त बातों में से किसी एक की सूची।

सामूहिक रूप से हम समूहीकरण वस्तुओं को कुंजियों के रूप में संदर्भित करते हैं। उदाहरण के लिए, निम्नलिखित DataFrame विचार करें:

ध्यान दें

0.20 संस्करण में नया।

groupby को दिया गया एक स्ट्रिंग या तो एक कॉलम या इंडेक्स स्तर को संदर्भित कर सकता है। यदि कोई स्ट्रिंग स्तंभ नाम और अनुक्रमणिका स्तर नाम से मेल खाती है, तो एक चेतावनी जारी की जाती है और कॉलम पूर्वता लेता है। यह भविष्य के संस्करण में एक अस्पष्टता त्रुटि के परिणामस्वरूप होगा।

In [1]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
   ...:                           'foo', 'bar', 'foo', 'foo'],
   ...:                    'B' : ['one', 'one', 'two', 'three',
   ...:                           'two', 'two', 'one', 'three'],
   ...:                    'C' : np.random.randn(8),
   ...:                    'D' : np.random.randn(8)})
   ...: 

In [2]: df
Out[2]: 
     A      B         C         D
0  foo    one  0.469112 -0.861849
1  bar    one -0.282863 -2.104569
2  foo    two -1.509059 -0.494929
3  bar  three -1.135632  1.071804
4  foo    two  1.212112  0.721555
5  bar    two -0.173215 -0.706771
6  foo    one  0.119209 -1.039575
7  foo  three -1.044236  0.271860

एक DataFrame पर, हम groupby groupby() को कॉल करके एक GroupBy ऑब्जेक्ट प्राप्त करते हैं। हम स्वाभाविक रूप से A या B कॉलम या दोनों के द्वारा समूह बना सकते हैं:

In [3]: grouped = df.groupby('A')

In [4]: grouped = df.groupby(['A', 'B'])

ये DataFrame को इसके सूचकांक (पंक्तियों) पर विभाजित करेगा। हम कॉलम द्वारा भी विभाजित कर सकते हैं:

In [5]: def get_letter_type(letter):
   ...:     if letter.lower() in 'aeiou':
   ...:         return 'vowel'
   ...:     else:
   ...:         return 'consonant'
   ...: 

In [6]: grouped = df.groupby(get_letter_type, axis=1)

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

In [7]: lst = [1, 2, 3, 1, 2, 3]

In [8]: s = pd.Series([1, 2, 3, 10, 20, 30], lst)

In [9]: grouped = s.groupby(level=0)

In [10]: grouped.first()
Out[10]: 
1    1
2    2
3    3
dtype: int64

In [11]: grouped.last()