2017-01-05 13 views
11

मुझे समझ में नहीं आता कि 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 मूल स्तंभ की कि दर्पण है। मैं फ़ंक्शन में हुड के तहत ऐसा क्यों होता है या क्या हो रहा है, इस बारे में किसी भी संकेत की सराहना करता हूं। चीयर्स।

+0

'apply' डेटा पतन नहीं करता है। 'लागू' लचीला है और किसी भी आकार की श्रृंखला या डेटाफ्रेम वापस कर सकता है। 'ट्रांसफॉर्म' हमेशा प्रत्येक समूह के लिए पंक्तियों की संख्या को संरक्षित करता है। 'ट्रांसफॉर्म' भी प्रत्येक कॉलम को कॉलिंग फ़ंक्शन में श्रृंखला के रूप में भेजता है। 'लागू' कॉलिंग फ़ंक्शन पर संपूर्ण डेटाफ्रेम भेजता है। –

+2

[संबंधित] (http://stackoverflow.com/a/38579754/2336654) – piRSquared

+0

आह! धन्यवाद @piRSquared। मुझे लगता है कि मैं बेहतर समझता हूं कि यह टिप्पणी पढ़ने और स्रोत कोड को देखने के बाद यह क्यों हो रहा है। – 3novak

उत्तर

6

ऐसा लगता है जैसे मूल स्तंभ है SeriesGroupBy.transform() की कोशिश करता ही एक के लिए परिणाम dtype कास्ट करने के लिए, लेकिन DataFrameGroupBy.transform() ऐसा प्रतीत नहीं होता है जैसे:

In [139]: df.groupby('id')['cat'].transform(lambda x: (x == 1).any()) 
Out[139]: 
0 1 
1 1 
2 1 
3 1 
4 1 
5 1 
6 1 
7 0 
8 0 
9 1 
Name: cat, dtype: int64 

#       v  v 
In [140]: df.groupby('id')[['cat']].transform(lambda x: (x == 1).any()) 
Out[140]: 
    cat 
0 True 
1 True 
2 True 
3 True 
4 True 
5 True 
6 True 
7 False 
8 False 
9 True 

In [141]: df.dtypes 
Out[141]: 
cat int64 
id  int64 
dtype: object