Saya bekerja dengan perpustakaan pandas dan saya ingin menambahkan dua kolom baru ke dataframe df
dengan n kolom (n> 0).
Kolom baru ini dihasilkan dari penerapan fungsi ke salah satu kolom di dataframe.
Fungsi yang akan diterapkan adalah seperti:
def calculate(x):
...operate...
return z, y
Salah satu metode untuk membuat kolom baru untuk fungsi yang hanya mengembalikan nilai adalah:
df['new_col']) = df['column_A'].map(a_function)
Jadi, yang saya inginkan, dan saya coba tidak berhasil (*), adalah seperti:
(df['new_col_zetas'], df['new_col_ys']) = df['column_A'].map(calculate)
Apa cara terbaik untuk mencapai ini? Saya memindai dokumentasi tanpa petunjuk.
** df['column_A'].map(calculate)
mengembalikan Seri pandas setiap item terdiri dari tupel z, y. Dan mencoba untuk menetapkan ini ke dua kolom dataframe menghasilkan ValueError. *
Jawaban teratas menurut saya salah. Mudah-mudahan, tidak ada yang mengimpor semua panda secara massal ke namespace mereka dengan
from pandas import *
. Selain itu,map
metode ini harus disediakan untuk saat-saat ketika meneruskan kamus atau Seri. Ini bisa mengambil fungsi tapi untuk itulahapply
digunakan.Jadi, jika Anda harus menggunakan pendekatan di atas, saya akan menulisnya seperti ini
Sebenarnya tidak ada alasan untuk menggunakan zip di sini. Anda cukup melakukan ini:
Metode kedua ini juga jauh lebih cepat pada DataFrames yang lebih besar
DataFrame dibuat dengan 300.000 baris
60x lebih cepat dari zip
Secara umum, hindari penggunaan apply
Penerapan umumnya tidak lebih cepat daripada melakukan iterasi pada daftar Python. Mari kita uji performa for-loop untuk melakukan hal yang sama seperti di atas
Jadi ini dua kali lebih lambat yang bukan merupakan regresi kinerja yang buruk, tetapi jika kita melakukan cythonisasi di atas, kita mendapatkan kinerja yang jauh lebih baik. Dengan asumsi, Anda menggunakan ipython:
Menugaskan secara langsung tanpa melamar
Anda bisa mendapatkan peningkatan kecepatan yang lebih besar jika Anda menggunakan operasi vektor langsung.
Ini mengambil keuntungan dari operasi vektorisasi NumPy yang sangat cepat daripada loop kita. Kami sekarang memiliki percepatan 30x dari aslinya.
Tes kecepatan paling sederhana dengan
apply
Contoh di atas harus dengan jelas menunjukkan betapa lambatnya
apply
bisa, tetapi agar lebih jelas mari kita lihat contoh paling dasar. Mari kita kuadratkan Seri 10 juta angka dengan dan tanpa menerapkanTanpa penerapan, 50x lebih cepat
sumber
applymap
untuk kasus ketika Anda harus mengimplementasikan fungsi tertentu untuk setiap elemen dataframe?func(series)
alih-alihseries.apply(func)
hanya berlaku jika fungsi sepenuhnya ditentukan menggunakan operasi yang berperilaku serupa pada nilai individu dan Seri. Itu adalah kasus dalam contoh di jawaban pertama, tetapi tidak demikian halnya dalam pertanyaan OP, yang menanyakan secara lebih umum tentang penerapan fungsi ke kolom. 1/2DataFrame({'a': ['Aaron', 'Bert', 'Christopher'], 'b': ['Bold', 'Courageous', 'Distrusted']})
andcalc
is:def calc(x): return x[0], len(x)
thentdf.a.apply(calc))
dancalc(tdf.a)
return sangat berbeda.