Apa iterrows () di python?

Iterasi dalam Pandas adalah anti-pola dan merupakan sesuatu yang hanya boleh Anda lakukan ketika Anda telah kehabisan pilihan lainnya. Anda tidak boleh menggunakan fungsi apa pun dengan "iter_" dalam namanya untuk lebih dari beberapa ribu baris atau Anda harus terbiasa menunggu lama

Apakah Anda ingin mencetak DataFrame?

Apakah Anda ingin menghitung sesuatu?

iterrows dan itertuples (keduanya menerima banyak suara sebagai jawaban atas pertanyaan ini) harus digunakan dalam keadaan yang sangat jarang, seperti menghasilkan objek baris/nametuple untuk pemrosesan berurutan, yang merupakan satu-satunya hal yang berguna untuk fungsi ini

Banding ke Otoritas

pada iterasi memiliki kotak peringatan merah besar yang bertuliskan

Iterasi melalui objek panda umumnya lambat. Dalam banyak kasus, pengulangan baris secara manual tidak diperlukan [. ]

* Ini sebenarnya sedikit lebih rumit daripada "jangan". df.iterrows() adalah jawaban yang benar untuk pertanyaan ini, tetapi "vektor operasi Anda" adalah yang lebih baik. Saya akui bahwa ada keadaan di mana iterasi tidak dapat dihindari (misalnya, beberapa operasi yang hasilnya bergantung pada nilai yang dihitung untuk baris sebelumnya). Namun, dibutuhkan beberapa keakraban dengan perpustakaan untuk mengetahui kapan. Jika Anda tidak yakin apakah Anda memerlukan solusi iteratif, Anda mungkin tidak membutuhkannya. PS. Untuk mengetahui lebih banyak tentang alasan saya menulis jawaban ini, lewati ke bagian paling bawah


Sejumlah operasi dan perhitungan dasar yang baik "divektorkan" oleh panda (baik melalui NumPy, atau melalui fungsi Cythonized). Ini termasuk aritmatika, perbandingan, (kebanyakan) pengurangan, pembentukan kembali (seperti pivot), penggabungan, dan operasi grup demi grup. Lihatlah dokumentasi untuk menemukan metode vektorisasi yang cocok untuk masalah Anda

Jika tidak ada, silakan tulis sendiri menggunakan custom


Pemahaman daftar harus menjadi tujuan panggilan Anda berikutnya jika 1) tidak ada solusi vektor yang tersedia, 2) kinerja itu penting, tetapi tidak cukup penting untuk melewati kerumitan menyitonisasi kode Anda, dan 3) Anda mencoba melakukan transformasi dengan elemen . Ada banyak bukti yang menunjukkan bahwa pemahaman daftar cukup cepat (dan bahkan terkadang lebih cepat) untuk banyak tugas umum Panda

Formulanya sederhana,

# Iterating over one column - `f` is some function that processes your data
result = [f(x) for x in df['col']]
# Iterating over two columns, use `zip`
result = [f(x, y) for x, y in zip(df['col1'], df['col2'])]
# Iterating over multiple columns - same data type
result = [f(row[0], ..., row[n]) for row in df[['col1', ...,'coln']].to_numpy()]
# Iterating over multiple columns - differing data type
result = [f(row[0], ..., row[n]) for row in zip(df['col1'], ..., df['coln'])]

Jika Anda dapat merangkum logika bisnis Anda ke dalam sebuah fungsi, Anda dapat menggunakan pemahaman daftar yang memanggilnya. Anda dapat membuat hal-hal rumit yang sewenang-wenang bekerja melalui kesederhanaan dan kecepatan kode Python mentah

Peringatan

Pemahaman daftar mengasumsikan bahwa data Anda mudah untuk dikerjakan - artinya tipe data Anda konsisten dan Anda tidak memiliki NaN, tetapi hal ini tidak selalu dapat dijamin

  1. Yang pertama lebih jelas, tetapi ketika berhadapan dengan NaN, lebih suka metode panda bawaan jika ada (karena mereka memiliki logika penanganan kasus sudut yang jauh lebih baik), atau pastikan logika bisnis Anda menyertakan logika penanganan NaN yang sesuai
  2. Saat berurusan dengan tipe data campuran, Anda harus mengulangi zip(df['A'], df['B'], ...) alih-alih df[['A', 'B']].to_numpy() karena yang terakhir secara implisit menampilkan data ke tipe yang paling umum. Sebagai contoh jika A adalah numerik dan B adalah string, to_numpy() akan mentransmisikan seluruh array ke string, yang mungkin bukan yang Anda inginkan. Untungnya zip_ping kolom Anda bersama-sama adalah solusi yang paling mudah untuk ini

* Mileage Anda mungkin berbeda karena alasan yang diuraikan di bagian Peringatan di atas


Contoh yang Jelas

Mari kita tunjukkan perbedaannya dengan contoh sederhana menambahkan dua kolom panda iter0. Ini adalah operasi yang dapat di-vektor, sehingga akan mudah untuk membandingkan kinerja metode yang dibahas di atas

Apa iterrows () di python?

Kode pembandingan, untuk referensi Anda. Baris di bagian bawah mengukur fungsi yang ditulis dalam numpandas, gaya Panda yang sangat bercampur dengan NumPy untuk menghasilkan performa maksimal. Menulis kode numpandas harus dihindari kecuali Anda tahu apa yang Anda lakukan. Tetap berpegang pada API di mana Anda bisa (mis. e. , lebih suka iter1 daripada iter2)

Saya harus menyebutkan, bagaimanapun, bahwa tidak selalu sekering dan sekering ini. Terkadang jawaban untuk "apa metode terbaik untuk suatu operasi" adalah "itu tergantung pada data Anda". Saran saya adalah untuk menguji pendekatan yang berbeda pada data Anda sebelum menetapkannya


Pendapat Pribadi Saya *

Sebagian besar analisis yang dilakukan pada berbagai alternatif keluarga iter dilakukan melalui lensa kinerja. Namun, dalam sebagian besar situasi, Anda biasanya akan mengerjakan kumpulan data berukuran wajar (tidak lebih dari beberapa ribu atau 100 ribu baris) dan kinerja akan berada di urutan kedua setelah kesederhanaan/keterbacaan solusi.

Inilah preferensi pribadi saya ketika memilih metode yang akan digunakan untuk suatu masalah

Untuk pemula

Vektorisasi (bila memungkinkan);

Untuk yang lebih berpengalaman

Vektorisasi (bila memungkinkan);

Vektorisasi berlaku sebagai metode yang paling idiomatis untuk setiap masalah yang dapat divektorisasi. Selalu berusaha untuk membuat vektor. Jika ragu, konsultasikan dengan dokumen, atau lihat Stack Overflow untuk pertanyaan yang ada tentang tugas khusus Anda

Saya cenderung melanjutkan tentang seberapa buruk DataFrame.to_string()_1 dalam banyak posting saya, tetapi saya mengakui lebih mudah bagi pemula untuk memahami apa yang dilakukannya. Selain itu, ada beberapa kasus penggunaan untuk DataFrame.to_string()1 telah dijelaskan dalam posting saya ini

Peringkat Cython lebih rendah dalam daftar karena membutuhkan lebih banyak waktu dan upaya untuk melakukannya dengan benar. Anda biasanya tidak perlu menulis kode dengan panda yang menuntut tingkat kinerja yang bahkan tidak dapat dipenuhi oleh pemahaman daftar

* Seperti pendapat pribadi lainnya, harap ambil dengan banyak garam


Bacaan lebih lanjut

* Metode string panda "divektorkan" dalam arti bahwa metode tersebut ditentukan pada rangkaian tetapi beroperasi pada setiap elemen. Mekanisme yang mendasarinya masih iteratif, karena operasi string secara inheren sulit untuk dibuat vektor


Mengapa Saya Menulis Jawaban ini

Kecenderungan umum yang saya perhatikan dari pengguna baru adalah mengajukan pertanyaan dalam bentuk "Bagaimana saya dapat mengulangi df saya untuk melakukan X?". Menampilkan kode yang memanggil iter_6 saat melakukan sesuatu di dalam loop DataFrame.to_string()4. Inilah alasannya. Seorang pengguna baru perpustakaan yang belum diperkenalkan dengan konsep vektorisasi kemungkinan besar akan membayangkan kode yang memecahkan masalah mereka sebagai pengulangan data mereka untuk melakukan sesuatu. Tidak tahu cara mengulangi DataFrame, hal pertama yang mereka lakukan adalah Google dan berakhir di sini, di pertanyaan ini. Mereka kemudian melihat jawaban yang diterima memberi tahu mereka caranya, dan mereka menutup mata dan menjalankan kode ini tanpa pernah mempertanyakan terlebih dahulu apakah iterasi adalah hal yang benar untuk dilakukan.

Tujuan dari jawaban ini adalah untuk membantu pengguna baru memahami bahwa iterasi belum tentu merupakan solusi untuk setiap masalah, dan bahwa solusi yang lebih baik, lebih cepat, dan lebih idiomatis dapat ada, dan perlu menginvestasikan waktu untuk menjelajahinya. Saya tidak mencoba untuk memulai perang iterasi vs. vektorisasi, tetapi saya ingin pengguna baru diberi tahu saat mengembangkan solusi untuk masalah mereka dengan perpustakaan ini

Haruskah saya menggunakan Iterrows?

Iterrows(). Ini harus benar-benar dihindari karena kinerjanya sangat lambat dibandingkan dengan teknik iterasi lainnya . Iterrows() membuat beberapa panggilan fungsi saat iterasi dan setiap baris iterasi memiliki properti bingkai data, yang membuatnya lebih lambat.

Bagaimana cara mengulangi baris dalam panda?

Ada banyak cara untuk mengulang baris DataFrame atau Seri di panda, masing-masing dengan kelebihan dan kekurangannya sendiri. .
Metode paling mudah untuk mengulangi baris adalah dengan metode iterrows() , seperti itu
iterrows() mengembalikan indeks baris serta baris itu sendiri

Apa itu Iterrows dan Ititems?

iteritems() − untuk mengulangi pasangan (key,value) . iterrows() − mengulangi baris sebagai pasangan (indeks, seri) . itertuples() − mengulangi baris sebagai namedtuples.

Apa itu Itertuples di Python?

Metode itertuples() menghasilkan objek iterator dari DataFrame, mengembalikan setiap baris sebagai objek Pyton Tuple .