Pertimbangkan kerangka data berikut:
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
Perintah-perintah berikut ini berfungsi:
> df.groupby('A').apply(lambda x: (x['C'] - x['D']))
> df.groupby('A').apply(lambda x: (x['C'] - x['D']).mean())
tetapi tidak satupun dari pekerjaan berikut:
> 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
Mengapa? Contoh pada dokumentasi tampaknya menyarankan bahwa memanggil transformgrup memungkinkan seseorang untuk melakukan pemrosesan operasi baris-bijaksana:
# 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)
Dengan kata lain, saya berpikir bahwa transformasi pada dasarnya adalah tipe penerapan tertentu (yang tidak agregat). Dimana saya salah
Untuk referensi, di bawah ini adalah konstruksi kerangka data asli di atas:
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), transformmenerima fungsi lambda yang mengasumsikan masing x- masing adalah item dalam group, dan juga mengembalikan nilai per item dalam grup. Apa yang saya lewatkan?
applymelewati seluruh df, tetapi transformmelewati setiap kolom satu per satu sebagai Seri. 2) applydapat mengembalikan output bentuk apa pun (skalar / Seri / DataFrame / array / list ...), sedangkan transformharus mengembalikan urutan (Seri 1D / array / daftar) dengan panjang yang sama dengan grup. Itu sebabnya OP apply()tidak perlu transform(). Ini adalah pertanyaan yang bagus karena dokter tidak menjelaskan kedua perbedaan dengan jelas. (mirip dengan perbedaan antara apply/map/applymap, atau hal-hal lain ...)

transformharus mengembalikan angka, baris, atau bentuk yang sama dengan argumen. jika itu angka maka nomor akan diatur ke semua elemen dalam grup, jika itu adalah baris, itu akan disiarkan ke semua baris dalam grup. Dalam kode Anda, fungsi lambda mengembalikan kolom yang tidak dapat disiarkan ke grup.