Saya telah mencoba fungsi df.iterrows()
tetapi kinerjanya sangat buruk. Yang tidak mengherankan mengingat bahwa iterrows()
mengembalikan Series
dengan skema lengkap dan meta data, bukan hanya nilai (yang saya butuhkan).
Metode kedua yang saya coba adalah for row in df.values
, yang secara signifikan lebih cepat. Namun, baru-baru ini saya menyadari bahwa df.values
bukanlah penyimpanan data internal DataFrame, karena df.values
mengubah semua dtypes
menjadi dtype
. Misalnya, salah satu kolom saya memiliki tipe int64
tetapi tipe tipe df.values
semuanya float64
. Jadi saya curiga bahwa df.values
sebenarnya membuat salinan lain dari data internal.
Selain itu, persyaratan lainnya adalah bahwa iterasi baris harus mengembalikan daftar nilai yang mempertahankan data asli dtype
.
Dalam python, iterasi pada baris akan menjadi (jauh) lebih lambat daripada melakukan operasi vektor.
Jenis-jenisnya diubah dalam metode kedua Anda karena begitulah cara array numpy (yang mana df.values
) bekerja. DataFrames berbasis kolom, sehingga Anda dapat memiliki satu DataFrame dengan beberapa tipe d. Setelah Anda mengulang meskipun secara baris, semuanya harus diarahkan ke tipe yang lebih umum yang menampung segalanya. Dalam kasus Anda ints pergi ke float64
.
Jika Anda mendeskripsikan masalah Anda dengan contoh kerja minimal, kami mungkin dapat membantu Anda melakukan vektorisasi. Anda mungkin juga beruntung di StackOverflow dengan tag pandas.
Pada dasarnya, saya ingin melakukan hal berikut:
row_handler = RowHandler(sample_df) # learn how to handle row from sample data
transformed_data = []
for row in df.values:
transformed_data.append(row_handler.handle(row))
return transformed_data
Saya tidak memiliki kelas RowHandler
dan karenanya hanya dapat mengoperasikan baris demi baris.
Contoh serupa lainnya adalah dalam pembelajaran mesin, di mana Anda mungkin memiliki model yang memiliki API prediksi hanya di tingkat baris.
Masih terlalu samar untuk bisa membantu. Tetapi jika RowHandler
benar-benar di luar kendali Anda, maka Anda akan kurang beruntung. FWIW semua API scikit-learn beroperasi pada array (jadi beberapa baris).
Saya tidak melihat bagaimana itu bisa lebih jelas. Ya, RowHandler
luar kendali saya. Apa yang Anda maksud dengan kurang beruntung? Pertanyaan saya adalah cara yang paling efisien untuk mengulang baris sambil menjaga dtype
dari setiap elemen tetap utuh. Apakah Anda menyarankan df.iterrows()
, atau yang lainnya?
sklearn
adalah pengecualian, bukan norma, yang beroperasi secara native pada PD DataFrame
. Tidak banyak perpustakaan pembelajaran mesin yang memiliki API yang beroperasi dengan DataFrame
.
Saya pikir df.itertuples()
adalah yang Anda cari - jauh lebih cepat daripada iterrows:
In [10]: x = pd.DataFrame({'x': range(10000)})
In [11]: %timeit list(x.iterrows())
1 loops, best of 3: 383 ms per loop
In [12]: %timeit list(x.itertuples())
1000 loops, best of 3: 1.39 ms per loop
Terima kasih @shoyer! Itu yang saya butuhkan.
Komentar yang paling membantu
Saya pikir
df.itertuples()
adalah yang Anda cari - jauh lebih cepat daripada iterrows: