दिलचस्प पोस्ट
c ++ अपवाद: std :: string को फेंकना GitHub को पुश नहीं कर सकते – यह कहता रहता है कि मर्ज की आवश्यकता है थ्रेड के विकल्प। Sleep () Xcode 4.2 डिबग स्टैक कॉल का प्रतीक नहीं है एक कस्टम संपादन प्रकार फ़ील्ड में एकाधिक इनपुट तत्व जोड़ें पीजी अपरिभाषित त्रुटि संबंध उपयोगकर्ता मौजूद नहीं है कैसे रनटाइम पर असेंबली खोज पथ में फ़ोल्डर जोड़ने के लिए .net? मेवेन त्रुटि: मुख्य वर्ग org.codehaus.plexus.classworlds.launcher.Launcher को ढूंढ या लोड नहीं किया जा सका पीडीएफ फाइल को HTML लिंक में डाउनलोड करने योग्य कैसे बनाऊं? मान से नाम स्ट्रिंग नाम रिक्त के लिए जांच – किस क्रम? OAuth 2 से OAuth 2 अलग कैसे है? क्या आप कई दृश्यों पर एक UIGStureRecognizer संलग्न कर सकते हैं? MySQL – चयन पर पंक्ति नंबर प्राप्त करें सीएसएस लोड हो रहा है के बाद ट्रिगर जो jQuery घटना?

एकाधिक समूह द्वारा कई कार्यों को कॉलम के अनुसार लागू करें

डॉक्स दिखाते हैं कि कैसे एक समूह द्वारा ऑब्जेक्ट पर एकाधिक फ़ंक्शन को एक समय में आउटपुट कॉलम नामों के साथ कुंजी के रूप में उपयोग करने के लिए लागू किया जाता है:

In [563]: grouped['D'].agg({'result1' : np.sum, .....: 'result2' : np.mean}) .....: Out[563]: result2 result1 A bar -0.579846 -1.739537 foo -0.280588 -1.402938 

हालांकि, यह केवल एक सीरीज ग्रुप द्वारा ऑब्जेक्ट पर काम करता है। और जब एक डिक्ट्री को समान रूप से डेटाफ़्रेम द्वारा समूह में भेज दिया जाता है, तो यह उम्मीद करता है कि कुंजियों को कॉलम के नाम होने की उम्मीद होती है जो फ़ंक्शन को लागू किया जाएगा।

मैं क्या करना चाहता हूं कई कॉलमों पर कई फ़ंक्शन लागू होते हैं (लेकिन कई कॉलम कई बार संचालित होंगे) इसके अलावा, कुछ फ़ंक्शन समूह द्वारा ऑब्जेक्ट के अन्य कॉलमों पर निर्भर करेगा (जैसे समिफ़ फ़ंक्शन) मेरा वर्तमान समाधान कॉलम के आधार पर कॉलम जाना है, और अन्य पंक्तियों पर निर्भर कार्यों के लिए लैम्ब्डा का उपयोग करते हुए ऊपर कोड की तरह कुछ करना है लेकिन यह एक लंबा समय ले रहा है, (मुझे लगता है कि यह एक समूह के माध्यम से पुनरावृत्ति करने के लिए एक लंबा समय लगता है)। मुझे इसे बदलना होगा ताकि मैं पूरे समूह के माध्यम से एक ही बार में ऑब्जेक्ट को पुनरावृति कर सकूं, लेकिन मैं सोच रहा हूं कि पंडों में यह कुछ ठीक से करने के लिए बनाया गया है।

उदाहरण के लिए, मैंने ऐसा कुछ करने की कोशिश की है

 grouped.agg({'C_sum' : lambda x: x['C'].sum(), 'C_std': lambda x: x['C'].std(), 'D_sum' : lambda x: x['D'].sum()}, 'D_sumifC3': lambda x: x['D'][x['C'] == 3].sum(), ...) 

लेकिन उम्मीद के अनुसार मुझे एक KeyError मिला (चूंकि चाबियाँ एक कॉलम होनी चाहिए अगर एग्रग को डाटाफ्रेम से कहा जाता है)।

क्या ऐसा करने के लिए कोई भी निर्माण होता है कि मैं क्या करना चाहता हूं, या यह संभावना है कि यह कार्यशीलता जोड़ा जा सकता है, या मुझे मैन्युअल रूप से समूह के माध्यम से पुनरावृति करने की आवश्यकता होगी?

धन्यवाद

वेब के समाधान से एकत्रित समाधान "एकाधिक समूह द्वारा कई कार्यों को कॉलम के अनुसार लागू करें"

पहले भाग के लिए आप चाबियों के लिए स्तंभ नामों और मूल्यों के कार्यों की एक सूची पारित कर सकते हैं:

 In [28]: df Out[28]: ABCDE GRP 0 0.395670 0.219560 0.600644 0.613445 0.242893 0 1 0.323911 0.464584 0.107215 0.204072 0.927325 0 2 0.321358 0.076037 0.166946 0.439661 0.914612 1 3 0.133466 0.447946 0.014815 0.130781 0.268290 1 In [26]: f = {'A':['sum','mean'], 'B':['prod']} In [27]: df.groupby('GRP').agg(f) Out[27]: AB sum mean prod GRP 0 0.719580 0.359790 0.102004 1 0.454824 0.227412 0.034060 

अद्यतन 1:

चूंकि समग्र फ़ंक्शन सीरीज़ पर काम करता है, अन्य स्तंभ नामों के संदर्भ खो जाते हैं। इसके चारों ओर पाने के लिए, आप लैम्ब्डा फ़ंक्शन के अंदर समूह इंडेक्स का उपयोग करके संपूर्ण डेटाफ्रेम और इंडेक्स का संदर्भ दे सकते हैं।

यहाँ एक हैकी समाधान है:

 In [67]: f = {'A':['sum','mean'], 'B':['prod'], 'D': lambda g: df.ix[g.index].E.sum()} In [69]: df.groupby('GRP').agg(f) Out[69]: ABD sum mean prod <lambda> GRP 0 0.719580 0.359790 0.102004 1.170219 1 0.454824 0.227412 0.034060 1.182901 

यहां, परिणामस्वरूप 'डी' कॉलम को 'ई' मानों के समकक्ष बना दिया गया है।

अद्यतन 2:

यहाँ एक विधि है जो मुझे लगता है कि जो भी आप पूछते हैं वह करेंगे। पहले एक कस्टम लैम्ब्डा फ़ंक्शन बनायें। नीचे, जी समूह का संदर्भ देता है जब समेकित, जी एक श्रृंखला होगी। पासिंग g.index to df.ix[] वर्तमान समूह को डीएफ से चुनता है। मैं फिर परीक्षण करता हूं कि यदि कॉलम सी 0.5 से कम है। लौटे बूलियन श्रृंखला g[] लिए पारित की जाती है जो मानदंडों को पूरा करने वाली उन पंक्तियों का चयन करती है।

 In [95]: cust = lambda g: g[df.ix[g.index]['C'] < 0.5].sum() In [96]: f = {'A':['sum','mean'], 'B':['prod'], 'D': {'my name': cust}} In [97]: df.groupby('GRP').agg(f) Out[97]: ABD sum mean prod my name GRP 0 0.719580 0.359790 0.102004 0.204072 1 0.454824 0.227412 0.034060 0.570441 

वर्तमान स्वीकृत उत्तर का दूसरा भाग पुराना है और इसमें दो बहिष्कार हैं। सबसे पहले और सबसे महत्वपूर्ण, आप अब किसी भी शब्दकोश के शब्दकोशों के माध्यम से agg को पास कर सकते हैं। दूसरा, कभी भी उपयोग नहीं करें।

अगर आप एक ही समय में दो अलग-अलग स्तंभों के साथ काम करना चाहते हैं, तो मैं उस विधि का उपयोग करने का सुझाव दूंगा जो implicitity को कार्यान्वित समारोह में एक DataFrame गुजरता है। चलो ऊपर से एक के रूप में एक समान डेटाफ्रेम का उपयोग करें

 df = pd.DataFrame(np.random.rand(4,4), columns=list('abcd')) df['group'] = [0, 0, 1, 1] df abcd group 0 0.418500 0.030955 0.874869 0.145641 0 1 0.446069 0.901153 0.095052 0.487040 0 2 0.843026 0.936169 0.926090 0.041722 1 3 0.635846 0.439175 0.828787 0.714123 1 

कॉलम नामों से एकत्रीकरण फ़ंक्शन के लिए मैप किए गए एक शब्द अभी भी एकत्रीकरण करने का एक अच्छा तरीका है।

 df.groupby('group').agg({'a':['sum', 'max'], 'b':'mean', 'c':'sum', 'd': lambda x: x.max() - x.min()}) abcd sum max mean sum <lambda> group 0 0.560541 0.507058 0.418546 1.707651 0.129667 1 0.187757 0.157958 0.887315 0.533531 0.652427 

यदि आपको वह बदसूरत लैम्ब्डा स्तंभ नाम पसंद नहीं है, तो आप सामान्य फ़ंक्शन का उपयोग कर सकते हैं और विशेष नाम __name__ विशेषता के लिए एक कस्टम नाम प्रदान कर सकते हैं:

 def max_min(x): return x.max() - x.min() max_min.__name__ = 'Max minus Min' df.groupby('group').agg({'a':['sum', 'max'], 'b':'mean', 'c':'sum', 'd': max_min}) abcd sum max mean sum Max minus Min group 0 0.560541 0.507058 0.418546 1.707651 0.129667 1 0.187757 0.157958 0.887315 0.533531 0.652427 

एक श्रृंखला apply और लौटने का उपयोग करना

अब, यदि आपके पास कई कॉलम हैं जो एक साथ बातचीत करने के लिए जरूरी हैं तो आप agg उपयोग नहीं कर सकते हैं, जो कुल मिलाकर काम करने के लिए एक सीरीज गुजरता है। उपयोग करते समय पूरे समूह को डेटाफ्रेम के रूप में फ़ंक्शन में पास किया जाता है।

मैं एक एकल कस्टम फ़ंक्शन बनाने की सलाह देता हूं जो सभी एग्रीग्रेन्स की श्रृंखला को वापस देता है। नए कॉलम के लिए लेबल के रूप में सीरीज सूचकांक का उपयोग करें:

 def f(x): d = {} d['a_sum'] = x['a'].sum() d['a_max'] = x['a'].max() d['b_mean'] = x['b'].mean() d['c_d_prodsum'] = (x['c'] * x['d']).sum() return pd.Series(d, index=['a_sum', 'a_max', 'b_mean', 'c_d_prodsum']) df.groupby('group').apply(f) a_sum a_max b_mean c_d_prodsum group 0 0.560541 0.507058 0.418546 0.118106 1 0.187757 0.157958 0.887315 0.276808 

यदि आप मल्टी इंडेक्स के साथ प्यार करते हैं, तो आप अभी भी इस तरह से एक श्रृंखला वापस कर सकते हैं:

  def f_mi(x): d = [] d.append(x['a'].sum()) d.append(x['a'].max()) d.append(x['b'].mean()) d.append((x['c'] * x['d']).sum()) return pd.Series(d, index=[['a', 'a', 'b', 'c_d'], ['sum', 'max', 'mean', 'prodsum']]) df.groupby('group').apply(f_mi) ab c_d sum max mean prodsum group 0 0.560541 0.507058 0.418546 0.118106 1 0.187757 0.157958 0.887315 0.276808