Pandas: Apa cara paling efisien untuk melakukan iterasi pada DataFrame Pandas baris demi baris?

Dibuat pada 12 Jun 2015  ·  6Komentar  ·  Sumber: pandas-dev/pandas

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 .

Usage Question

Komentar yang paling membantu

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

Semua 6 komentar

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat