พิจารณา dataframe ต่อไปนี้:
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
สามารถส่งคืนรูปร่างใด ๆ (scalar / Series / DataFrame / array / list ... ) ในขณะที่transform
ต้องส่งคืนลำดับ (1D Series / array / list) ความยาวเท่ากับกลุ่ม นั่นเป็นเหตุผลที่ OP ต้องการไม่ได้apply()
transform()
นี่เป็นคำถามที่ดีเนื่องจากเอกสารไม่ได้อธิบายความแตกต่างทั้งสองอย่างชัดเจน (คล้ายกับความแตกต่างระหว่างapply/map/applymap
หรือสิ่งอื่น ๆ ... )
transform
ต้องส่งคืนตัวเลขแถวหรือรูปร่างเดียวกันกับอาร์กิวเมนต์ หากเป็นตัวเลขหมายเลขจะถูกตั้งค่าเป็นองค์ประกอบทั้งหมดในกลุ่มถ้าเป็นแถวรายการนั้นจะถูกกระจายไปยังแถวทั้งหมดในกลุ่ม ในโค้ดของคุณฟังก์ชั่นแลมบ์ดาจะส่งคืนคอลัมน์ซึ่งไม่สามารถออกอากาศไปยังกลุ่มได้