मुझे समझ में नहीं आता कि apply
और transform
एक ही डेटा फ्रेम पर कॉल किए जाने पर अलग-अलग प्रकार के रिटर्न क्यों देते हैं। जिस तरह से मैंने "apply
" के साथ कुछ काम करने के पहले कुछ कार्यों को समझाया, डेटा को ध्वस्त कर दिया गया, और transform
बिल्कुल apply
जैसा ही है लेकिन मूल अनुक्रमणिका को संरक्षित करता है और पतन नहीं होता है। " निम्नलिखित को धयान मे रखते हुए।पांडस ट्रांसफॉर्म() बनाम लागू()
df = pd.DataFrame({'id': [1,1,1,2,2,2,2,3,3,4],
'cat': [1,1,0,0,1,0,0,0,0,1]})
के उन id
रों जो cat
कॉलम में एक अशून्य प्रविष्टि की पहचान करते हैं।
>>> df.groupby('id')['cat'].apply(lambda x: (x == 1).any())
id
1 True
2 True
3 False
4 True
Name: cat, dtype: bool
ग्रेट। अगर हम एक सूचक कॉलम बनाना चाहते थे, हालांकि, हम निम्नलिखित कर सकते थे।
>>> df.groupby('id')['cat'].transform(lambda x: (x == 1).any())
0 1
1 1
2 1
3 1
4 1
5 1
6 1
7 0
8 0
9 1
Name: cat, dtype: int64
मुझे समझ नहीं आता क्यों dtype अब बूलियन any()
समारोह से वापस लौटे के बजाय int64
है।
जब मैं कुछ बूलियन रखने के लिए मूल डेटा फ्रेम बदलता हूं (ध्यान दें कि शून्य रहता है), ट्रांसफॉर्म दृष्टिकोण object
कॉलम में बूलियन लौटाता है। यह मेरे लिए एक अतिरिक्त रहस्य है क्योंकि सभी मूल्य बूलियन हैं, लेकिन यह object
के रूप में सूचीबद्ध है जो स्पष्ट रूप से पूर्णांक और बूलियन के मूल मिश्रित-प्रकार कॉलम के dtype
से मेल खाते हैं।
df = pd.DataFrame({'id': [1,1,1,2,2,2,2,3,3,4],
'cat': [True,True,0,0,True,0,0,0,0,True]})
>>> df.groupby('id')['cat'].transform(lambda x: (x == 1).any())
0 True
1 True
2 True
3 True
4 True
5 True
6 True
7 False
8 False
9 True
Name: cat, dtype: object
हालांकि, जब मैं सभी बूलियंस का उपयोग, को बदलने समारोह एक बूलियन स्तंभ लौटाता है।
df = pd.DataFrame({'id': [1,1,1,2,2,2,2,3,3,4],
'cat': [True,True,False,False,True,False,False,False,False,True]})
>>> df.groupby('id')['cat'].transform(lambda x: (x == 1).any())
0 True
1 True
2 True
3 True
4 True
5 True
6 True
7 False
8 False
9 True
Name: cat, dtype: bool
मेरी तीव्र पैटर्न मान्यता कौशल का उपयोग करना, यह प्रतीत होता है जिसके परिणामस्वरूप स्तंभ के dtype
मूल स्तंभ की कि दर्पण है। मैं फ़ंक्शन में हुड के तहत ऐसा क्यों होता है या क्या हो रहा है, इस बारे में किसी भी संकेत की सराहना करता हूं। चीयर्स।
'apply' डेटा पतन नहीं करता है। 'लागू' लचीला है और किसी भी आकार की श्रृंखला या डेटाफ्रेम वापस कर सकता है। 'ट्रांसफॉर्म' हमेशा प्रत्येक समूह के लिए पंक्तियों की संख्या को संरक्षित करता है। 'ट्रांसफॉर्म' भी प्रत्येक कॉलम को कॉलिंग फ़ंक्शन में श्रृंखला के रूप में भेजता है। 'लागू' कॉलिंग फ़ंक्शन पर संपूर्ण डेटाफ्रेम भेजता है। –
[संबंधित] (http://stackoverflow.com/a/38579754/2336654) – piRSquared
आह! धन्यवाद @piRSquared। मुझे लगता है कि मैं बेहतर समझता हूं कि यह टिप्पणी पढ़ने और स्रोत कोड को देखने के बाद यह क्यों हो रहा है। – 3novak