निम्नलिखित डेटाफ़्रेम पर विचार करें:
A B C D
0 foo one 0.162003 0.087469
1 bar one -1.156319 -1.526272
2 foo two 0.833892 -1.666304
3 bar three -2.026673 -0.322057
4 foo two 0.411452 -0.954371
5 bar two 0.765878 -0.095968
6 foo one -0.654890 0.678091
7 foo three -1.789842 -1.130922
निम्नलिखित आदेश काम करते हैं:
> df.groupby('A').apply(lambda x: (x['C'] - x['D']))
> df.groupby('A').apply(lambda x: (x['C'] - x['D']).mean())
लेकिन निम्न में से कोई भी काम नहीं:
> df.groupby('A').transform(lambda x: (x['C'] - x['D']))
ValueError: could not broadcast input array from shape (5) into shape (5,3)
> df.groupby('A').transform(lambda x: (x['C'] - x['D']).mean())
TypeError: cannot concatenate a non-NDFrame object
क्यों? दस्तावेज़ीकरण पर उदाहरण से लगता है कि transformसमूह में कॉल करने से कोई पंक्ति-वार ऑपरेशन प्रक्रिया कर सकता है:
# Note that the following suggests row-wise operation (x.mean is the column mean)
zscore = lambda x: (x - x.mean()) / x.std()
transformed = ts.groupby(key).transform(zscore)
दूसरे शब्दों में, मैंने सोचा था कि परिवर्तन अनिवार्य रूप से एक विशिष्ट प्रकार का लागू होता है (जो कि समग्र नहीं होता है)। मैं गलत कहाँ हूँ?
संदर्भ के लिए, नीचे मूल डेटाफ़्रेम का निर्माण नीचे दिया गया है:
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B' : ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'C' : randn(8), 'D' : randn(8)})
zscore) के साथ कॉपी किया है , तो transformएक लंबो फ़ंक्शन प्राप्त होता है जो मानता है कि प्रत्येक xआइटम के भीतर है group, और समूह में प्रति आइटम मान भी लौटाता है । मैं क्या खो रहा हूँ?
applyपूरे df में transformगुजरता है , लेकिन प्रत्येक कॉलम को एक श्रृंखला के रूप में व्यक्तिगत रूप से पास करता है। 2) applyकिसी भी आकार के आउटपुट (स्केलर / सीरीज / डेटाफ़्रेम / एरे / लिस्ट ...) transformको वापस कर सकता है , जबकि एक सीक्वेंस (1 डी सीरीज़ / एरे / लिस्ट) को ग्रुप की तरह ही वापस करना होगा। इसलिए ओपी की जरूरत apply()नहीं है transform()। यह एक अच्छा सवाल है क्योंकि डॉक्टर ने दोनों मतभेदों को स्पष्ट रूप से नहीं बताया है। (भेद apply/map/applymap, या अन्य चीजों के बीच अंतर ...)

transformएक संख्या, एक पंक्ति, या तर्क के समान आकार वापस करना होगा। यदि यह एक संख्या है तो समूह में सभी तत्वों के लिए संख्या निर्धारित की जाएगी, यदि यह एक पंक्ति है, तो इसे समूह में सभी पंक्तियों में प्रसारित किया जाएगा। आपके कोड में, लैम्ब्डा फ़ंक्शन एक कॉलम लौटाता है जिसे समूह में प्रसारित नहीं किया जा सकता है।