Saat memiliki Pandaf DataFrame seperti ini:
import pandas as pd
import numpy as np
df = pd.DataFrame({'today': [['a', 'b', 'c'], ['a', 'b'], ['b']],
'yesterday': [['a', 'b'], ['a'], ['a']]})
today yesterday
0 ['a', 'b', 'c'] ['a', 'b']
1 ['a', 'b'] ['a']
2 ['b'] ['a']
... etc
Tetapi dengan sekitar 100.000 entri, saya mencari untuk menemukan penambahan dan penghapusan daftar itu di dua kolom berdasarkan baris-bijaksana.
Ini sebanding dengan pertanyaan ini: Pandas: Bagaimana Membandingkan Kolom Daftar Baris-bijaksana dalam DataFrame dengan Pandas (bukan untuk loop)? tapi saya melihat perbedaannya, dan Pandas.apply
metode sepertinya tidak secepat itu untuk banyak entri. Ini adalah kode yang saya gunakan saat ini. Pandas.apply
dengan numpy's setdiff1d
metode:
additions = df.apply(lambda row: np.setdiff1d(row.today, row.yesterday), axis=1)
removals = df.apply(lambda row: np.setdiff1d(row.yesterday, row.today), axis=1)
Ini berfungsi dengan baik, namun dibutuhkan sekitar satu menit untuk 120 000 entri. Jadi adakah cara yang lebih cepat untuk mencapai ini?
Jawaban:
Tidak yakin tentang kinerja, tetapi pada kurangnya solusi yang lebih baik ini mungkin berlaku:
Pemindahan:
Tambahan:
sumber
applymap
, tapi senang itu berhasil untuk Anda!sumber
Saya akan menyarankan Anda untuk menghitung
additions
danremovals
menerapkan yang sama.Hasilkan contoh yang lebih besar
Solusi Anda
Solusi Anda pada satu aplikasi berlaku
Menggunakan
set
Kecuali jika daftar Anda sangat besar, Anda dapat menghindari
numpy
solusi @ r.ook
Jika Anda senang memiliki set alih-alih daftar sebagai output, Anda dapat menggunakan kode @ r.ook
Solusi @Andreas K.
dan pada akhirnya Anda dapat menambahkan
.apply(list)
untuk mendapatkan hasil yang samasumber
Inilah salah satu dengan gagasan offloading compute part ke alat NumPy vektor. Kami akan mengumpulkan semua data ke array tunggal untuk setiap header, melakukan semua pencocokan yang diperlukan pada NumPy dan akhirnya memotong kembali ke entri baris yang diperlukan. Pada NumPy yang melakukan bagian pengangkatan berat, kami akan menggunakan hashing berdasarkan ID grup dan ID dalam setiap grup yang menggunakan
np.searchsorted
. Kami juga memanfaatkan angka-angka karena lebih cepat dengan NumPy. Implementasinya akan terlihat seperti ini -Optimalisasi lebih lanjut dimungkinkan pada langkah-langkah untuk menghitung
t_mask
dany_mask
, di mananp.searchsorted
dapat digunakan lagi.Kita juga bisa menggunakan penugasan array sederhana sebagai alternatif untuk
isin
langkaht_mask
dany_mask
, seperti -sumber