मेरे पास एक बड़ा डेटाफ्रेम है, और मैं एक से एन कॉलम में समूह कर रहा हूं, और इन समूहों पर दो कॉलम (उदा। फू और बार) में एक फ़ंक्शन लागू करना चाहता हूं।एकाधिक कॉलम में ग्रुपबी ट्रांसफॉर्म का उपयोग कैसे करें
यहाँ एक उदाहरण dataframe है:
foo_function = lambda x: np.sum(x.a+x.b)
df = pd.DataFrame({'a':[1,2,3,4,5,6],
'b':[1,2,3,4,5,6],
'c':['q', 'q', 'q', 'q', 'w', 'w'],
'd':['z','z','z','o','o','o']})
# works with apply, but I want transform:
df.groupby(['c', 'd'])[['a','b']].apply(foo_function)
# transform doesn't work!
df.groupby(['c', 'd'])[['a','b']].transform(foo_function)
TypeError: cannot concatenate a non-NDFrame object
लेकिन transform
जाहिरा तौर पर एकाधिक स्तंभों को एक साथ गठबंधन करने के लिए सक्षम नहीं है, क्योंकि यह (लागू विपरीत) अलग से प्रत्येक स्तंभ पर लग रहा है। गति/लालित्य के मामले में अगला सबसे अच्छा विकल्प क्या है? जैसे मैं apply
का उपयोग कर सकता हूं और फिर pd.match
का उपयोग कर बना सकता हूं, लेकिन कभी-कभी कई समूह-कॉलम (col1 और col2) से मेल खाने की आवश्यकता होती है जो वास्तव में हैकी/उचित मात्रा में कोड लेती है।
-> क्या कोई ऐसा फ़ंक्शन है जो groupby() के रूप में है। ट्रांसफॉर्म जो कई कॉलम पर काम करने वाले फ़ंक्शंस का उपयोग कर सकता है? यदि यह अस्तित्व में नहीं है, तो सबसे अच्छा हैक क्या है?
यह 0.1 9 .1 में एक महत्वपूर्ण त्रुटि फेंक रहा है। यह मेरी समझ थी कि रूपांतरण एक श्रृंखला (प्रत्येक कॉलम) को फ़ंक्शन में पास करता है। लेकिन बहुत अजीब बात यह है कि उपरोक्त डेटा के साथ निम्नलिखित चलने पर भी एक बार डेटाफ्रेम भी गुजरता है। 'df.groupby (['c', 'd'])। ट्रांसफॉर्म (लैम्ब्डा x: प्रिंट (प्रकार (x)))'।यह एक बग –
@TedPetrou जैसा दिखता है: इसे इंगित करने के लिए धन्यवाद। एक प्रदर्शन वृद्धि के रूप में, 'ट्रांसफॉर्म' - जैसे 'लागू करें' - फ़ंक्शन को (उप-) डेटाफ्रेम पर लागू करने का प्रयास कर सकता है। कुछ परिस्थितियों में (जैसे वेक्टरकृत फ़ंक्शन और कॉलम के बहुत सारे) यह प्रत्येक समूह और कॉलम के लिए फ़ंक्शन को लागू करने से तेज़ हो सकता है। – unutbu
@TedPetrou: 'KeyError' के बारे में - अब जब मैं अपने मूल उत्तर पर वापस देखता हूं, तो मुझे नहीं लगता कि मैंने जो समाधान सुझाया है वह एक अच्छा है। 'ट्रांसफॉर्म' प्रत्येक समूह के लिए फ़ंक्शन को एक बार कॉल करता है। यदि आप बड़े इनपुट पर वेक्टरिज्ड कार्यों को कम समय कहते हैं तो आपको बेहतर प्रदर्शन मिलता है। इसलिए, कॉलिंग 'ट्रांसफॉर्म' से पहले * पूरे कॉलम पर' df ['a'] + df ['b'] 'की गणना करने के लिए यह अधिक समझ में आता है। मैंने उपर्युक्त पोस्ट को संशोधित करने के लिए संशोधित किया है जो मेरा मतलब है। – unutbu