Bisakah Anda memberi tahu saya kapan harus menggunakan metode vektorisasi ini dengan contoh-contoh dasar?
Saya melihat itu map
adalah Series
metode sedangkan sisanya adalah DataFrame
metode. Saya bingung tentang apply
dan applymap
metode. Mengapa kita memiliki dua metode untuk menerapkan fungsi ke DataFrame? Sekali lagi, contoh sederhana yang menggambarkan penggunaan akan sangat bagus!
python
pandas
dataframe
vectorization
marillion
sumber
sumber
Jawaban:
Langsung dari buku Analisis Data untuk Wes McKinney , hal. 132 (Saya sangat merekomendasikan buku ini):
Ringkasnya,
apply
bekerja berdasarkan baris / kolom pada DataFrame,applymap
bekerja berdasarkan elemen pada DataFrame, danmap
bekerja berdasarkan elemen pada Seri.sumber
func
untuklambda x: [func(y) for y in x]
, dan menerapkan kolom-bijaksana)map
danapplymap
keduanya bekerja berdasarkan elemen, saya akan mengharapkan satu metode (baikmap
atauapplymap
) yang akan bekerja baik untuk Seri dan DataFrame. Mungkin ada pertimbangan desain lain, dan Wes McKinney memutuskan untuk datang dengan dua metode berbeda.applymap
bersama dengangroupby
fungsi dalam panda?Membandingkan
map
,applymap
dan : Konteks Konteksap
ply
Perbedaan utama pertama: DEFINISI
map
didefinisikan pada Seri SAJAapplymap
didefinisikan pada DataFrames SAJAapply
didefinisikan pada KEDUAPerbedaan besar kedua: ARGUMEN INPUT
map
menerimadict
sSeries
,, atau dapat dipanggilapplymap
danapply
hanya menerima callablePerbedaan utama ketiga: PERILAKU
map
adalah elemen untuk Seriapplymap
adalah elementwise untuk DataFramesapply
juga berfungsi secara elemen tetapi cocok untuk operasi dan agregasi yang lebih kompleks. Perilaku dan nilai kembali tergantung pada fungsinya.Perbedaan utama keempat (yang paling penting): GUNAKAN KASUS
map
dimaksudkan untuk memetakan nilai dari satu domain ke domain lain, sehingga dioptimalkan untuk kinerja (mis.,df['A'].map({1:'a', 2:'b', 3:'c'})
)applymap
baik untuk transformasi elemen di beberapa baris / kolom (mis.,df[['A', 'B', 'C']].applymap(str.strip)
)apply
adalah untuk menerapkan fungsi apa pun yang tidak dapat di-vectorised (mis.,df['sentences'].apply(nltk.sent_tokenize)
)Meringkas
sumber
Ada informasi yang bagus dalam jawaban ini, tapi saya menambahkan sendiri untuk meringkas dengan jelas metode mana yang bekerja dengan baik secara array versus elemen. jeremiahbuddha kebanyakan melakukan ini tetapi tidak menyebutkan Series. Saya tidak punya perwakilan untuk berkomentar.
DataFrame.apply
beroperasi pada seluruh baris atau kolom sekaligus.DataFrame.applymap
,,Series.apply
danSeries.map
beroperasi pada satu elemen pada satu waktu.Ada banyak tumpang tindih antara kemampuan
Series.apply
danSeries.map
, yang berarti bahwa salah satu akan bekerja dalam banyak kasus. Mereka memang memiliki beberapa perbedaan kecil, beberapa di antaranya dibahas dalam jawaban osa.sumber
Menambah jawaban lain, di
Series
sana juga ada peta dan terapkan .Terapkan dapat membuat DataFrame dari seri ; Namun, peta hanya akan menempatkan seri di setiap sel dari seri lain, yang mungkin bukan yang Anda inginkan.
Juga jika saya memiliki fungsi dengan efek samping, seperti "terhubung ke server web", saya mungkin akan menggunakan
apply
hanya demi kejelasan.Map
tidak hanya dapat menggunakan fungsi, tetapi juga kamus atau seri lainnya. Katakanlah Anda ingin memanipulasi permutasi .Mengambil
Kuadrat dari permutasi ini adalah
Anda dapat menghitungnya menggunakan
map
. Tidak yakin apakah aplikasi mandiri didokumentasikan, tetapi berfungsi0.15.1
.sumber
@jeremiahbuddha menyebutkan bahwa menerapkan karya pada baris / kolom, sedangkan applymap berfungsi dengan bijaksana. Tapi sepertinya Anda masih dapat menggunakan aplikasi untuk perhitungan elemen-bijaksana ....
sumber
Hanya ingin menunjukkan, karena saya berjuang dengan ini sebentar
ini tidak mengubah kerangka data itu sendiri, harus dipindahkan
sumber
df = modified_df
atau jika Anda menetapkaninplace=True
bendera. Juga kerangka data akan berubah jika Anda meneruskan kerangka data ke suatu fungsi dengan referensi dan fungsi memodifikasi kerangka data.ix
atau.where
dll. Tidak yakin untuk apa penjelasan lengkapnya saat Anda perlu menetapkan ulang dan kapan tidak.Mungkin penjelasan paling sederhana perbedaan antara aplikasi dan aplikasi:
menerapkan mengambil seluruh kolom sebagai parameter dan kemudian menetapkan hasilnya ke kolom ini
applymap mengambil nilai sel yang terpisah sebagai parameter dan menetapkan hasilnya kembali ke sel ini.
NB Jika berlaku mengembalikan nilai tunggal Anda akan memiliki nilai ini, bukan kolom setelah penugasan dan akhirnya akan memiliki hanya satu baris, bukan matriks.
sumber
Pemahaman saya:
Dari sudut pandang fungsi:
Jika fungsi memiliki variabel yang perlu dibandingkan dalam kolom / baris, gunakan
apply
.misalnya:
lambda x: x.max()-x.mean()
.Jika fungsi akan diterapkan ke setiap elemen:
1> Jika kolom / baris ditemukan, gunakan
apply
2> Jika berlaku untuk seluruh kerangka data, gunakan
applymap
sumber
Berdasarkan jawaban cs95
map
didefinisikan pada Seri SAJAapplymap
didefinisikan pada DataFrames SAJAapply
didefinisikan pada KEDUAberikan beberapa contoh
sumber
FOMO:
Contoh berikut menunjukkan
apply
danapplymap
diterapkan pada aDataFrame
.map
Fungsi adalah sesuatu yang Anda lakukan pada Seri saja. Anda tidak dapat menerapkanmap
pada DataFrame.Yang perlu diingat adalah
apply
bisa melakukan apa sajaapplymap
bisa, tetapiapply
memiliki opsi eXtra .Opsi faktor X adalah:
axis
dan diresult_type
manaresult_type
hanya berfungsi ketikaaxis=1
(untuk kolom).Sebagai sidenote,
map
fungsi Series , tidak harus bingung denganmap
fungsi Python .Yang pertama diterapkan pada Seri, untuk memetakan nilai, dan yang kedua untuk setiap item yang dapat diulang.
Terakhir, jangan membingungkan
apply
metode dataframe denganapply
metode groupby .sumber