নিম্নলিখিত ডেটাফ্রেম বিবেচনা করুন:
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
পুরো ডিএফ এ transform
যায় তবে প্রতিটি কলাম পৃথকভাবে সিরিজ হিসাবে পাস করে। 2) apply
যে কোনও আকারের আউটপুট (স্কেলার / সিরিজ / ডেটা ফ্রেম / অ্যারে / তালিকা ...) transform
ফিরিয়ে দিতে পারে , তবে অবশ্যই গ্রুপের সমান দৈর্ঘ্যের একটি সিকোয়েন্স (1 ডি সিরিজ / অ্যারে / তালিকা) প্রদান করতে হবে। এজন্য ওপি দরকার apply()
নেই transform()
। এটি একটি ভাল প্রশ্ন যেহেতু ডক উভয় পার্থক্য পরিষ্কারভাবে ব্যাখ্যা করেন নি। ( apply/map/applymap
বা অন্যান্য জিনিসের মধ্যে পার্থক্যের অনুরূপ ...)
transform
অবশ্যই একটি সংখ্যা, একটি সারি বা আর্গুমেন্টের মতো একই আকারটি ফেরত দিতে হবে। যদি এটি একটি সংখ্যা হয় তবে সংখ্যাটি গ্রুপের সমস্ত উপাদানকে সেট করা হবে, যদি এটি একটি সারি হয় তবে এটি গোষ্ঠীর সমস্ত সারিতে সম্প্রচারিত হবে। আপনার কোডে ল্যাম্বদা ফাংশনটি একটি কলাম দেয় যা গোষ্ঠীতে সম্প্রচারিত হতে পারে না।