Saya ingin menerapkan fungsi dengan argumen ke seri di python panda:
x = my_series.apply(my_function, more_arguments_1)
y = my_series.apply(my_function, more_arguments_2)
...
The dokumentasi menggambarkan dukungan untuk menerapkan metode, tetapi tidak menerima argumen. Apakah ada metode berbeda yang menerima argumen? Atau, apakah saya melewatkan solusi sederhana?
Pembaruan (Oktober 2017): Perhatikan bahwa sejak pertanyaan ini awalnya ditanyakan bahwa panda apply()
telah diperbarui untuk menangani argumen posisi dan kata kunci dan tautan dokumentasi di atas sekarang mencerminkan hal itu dan menunjukkan bagaimana cara memasukkan kedua jenis argumen.
functools.partial
, ataustarmap
?DataFrame.apply
dokumen danSeries.apply
dokumenJawaban:
Versi panda yang lebih baru memungkinkan Anda memberikan argumen tambahan (lihat dokumentasi baru ). Jadi sekarang Anda bisa melakukannya:
Argumen posisional ditambahkan setelah elemen seri.
Untuk versi panda yang lebih lama:
Dokumentasi menjelaskan hal ini dengan jelas. Metode yang berlaku menerima fungsi python yang seharusnya memiliki parameter tunggal. Jika Anda ingin memberikan lebih banyak parameter, Anda harus menggunakan
functools.partial
seperti yang disarankan oleh Joel Cornett dalam komentarnya.Sebuah contoh:
Anda juga dapat menggunakan argumen kata kunci menggunakan
partial
.Cara lain adalah dengan membuat lambda:
Tapi saya pikir menggunakan
partial
lebih baik.sumber
args
argumen, yang merupakan tuple memegang argumen posisi tambahan atau ** kwds untuk yang bernama. Saya membuat masalah untuk memiliki ini juga untuk Series.apply () github.com/pydata/pandas/issues/1829'abc'
, makaargs=('abc')
akan dievaluasi sebagai tiga argumen('a', 'b', 'c')
. Untuk menghindari hal ini, Anda harus memberikan tuple yang berisi string, dan untuk itu, sertakan tanda koma:args=('abc',)
Langkah:
Contoh
Hasil dari contoh ini adalah bahwa setiap angka dalam kerangka data akan ditambahkan ke angka 9.
Penjelasan:
Fungsi "add" memiliki dua parameter: i1, i2. Parameter pertama akan menjadi nilai dalam bingkai data dan yang kedua adalah apa pun yang kita berikan ke fungsi "apply". Dalam hal ini, kami meneruskan "9" ke fungsi terapkan menggunakan argumen kata kunci "i2".
sumber
sumber
func
. Jadi, jika saya ingin menerapkanpd.Series.mean(axis=1)
bagaimana cara memasukkanaxis=1
?Anda dapat meneruskan sejumlah argumen ke fungsi yang
apply
memanggil argumen yang tidak disebutkan namanya, dilewatkan sebagai tuple keargs
parameter, atau melalui argumen kata kunci lain yang ditangkap secara internal sebagai kamus berdasarkankwds
parameter.Misalnya, mari kita membangun fungsi yang mengembalikan True untuk nilai antara 3 dan 6, dan False sebaliknya.
Fungsi anonim ini tidak terlalu fleksibel. Mari kita buat fungsi normal dengan dua argumen untuk mengontrol nilai min dan maks yang kita inginkan di Seri kita.
Kami dapat mereplikasi output dari fungsi pertama dengan memberikan argumen tanpa nama ke
args
:Atau kita bisa menggunakan argumen yang disebutkan
Atau bahkan kombinasi keduanya
sumber