Baru-baru ini mulai bercabang dari tempat aman saya (R) ke Python dan dan saya agak bingung dengan lokalisasi sel / seleksi di Pandas
. Saya telah membaca dokumentasinya tetapi saya berjuang untuk memahami implikasi praktis dari berbagai pilihan pelokalan / pemilihan.
- Apakah ada alasan mengapa saya harus menggunakan
.loc
atau menggunakan.iloc
opsi yang paling umum.ix
? - Saya mengerti bahwa
.loc
,iloc
,at
, daniat
dapat memberikan beberapa dijamin kebenaran yang.ix
tidak dapat menawarkan, tapi saya juga membaca di mana.ix
cenderung menjadi solusi tercepat di seluruh papan. - Tolong jelaskan alasan di dunia nyata, praktik terbaik di balik menggunakan apa pun selain
.ix
?
loc
adalah pengindeksan berbasis label sehingga pada dasarnya mencari nilai dalam satu baris,iloc
adalah pengindeksan berbasis baris integer,ix
adalah metode umum yang pertama kali melakukan berbasis label, jika gagal maka jatuh ke basis integer.at
sudah usang dan disarankan Anda tidak menggunakannya lagi. Hal lain yang perlu dipertimbangkan adalah apa yang Anda coba lakukan karena beberapa metode ini memungkinkan pengirisan, dan penugasan kolom, sejujurnya, dokumennyaat
sudah usang? Saya tidak melihatnya di dokumen at (atau iat ).loc
,ix
dan diiloc
sini: stackoverflow.com/questions/31593201/…Jawaban:
loc: hanya bekerja pada indeks
iloc: bekerja pada posisi
ix: Anda bisa mendapatkan data dari dataframe tanpa harus di indeks
di: dapatkan nilai skalar. Ini adalah loc
iat yang sangat cepat : Dapatkan nilai skalar. Ini iloc yang sangat cepat
http://pyciencia.blogspot.com/2015/05/obtener-y-filtrar-datos-de-un-dataframe.html
Catatan: Sampai
pandas 0.20.0
, yang.ix
pengindeks yang ditinggalkan mendukung lebih ketat.iloc
dan.loc
pengindeks.sumber
at
daniat
merupakan versi yang sangat cepatloc
daniloc
, lalu mengapa menggunakanloc
daniloc
sama sekali?at
daniat
dimaksudkan untuk mengakses skalar, yaitu elemen tunggal dalam kerangka data, sementaraloc
daniloc
sedang mengakses beberapa elemen pada saat yang sama, berpotensi untuk melakukan operasi vektor.Diperbarui untuk
pandas
0.20
diberikan yangix
sudah usang. Ini menunjukkan tidak hanya bagaimana menggunakanloc
,iloc
,at
,iat
,set_value
, tapi bagaimana untuk mencapai, campuran pengindeksan berdasarkan posisi / label.loc
- berbasis labelMemungkinkan Anda untuk melewatkan array 1-D sebagai pengindeks. Array dapat berupa irisan (himpunan bagian) dari indeks atau kolom, atau mereka bisa menjadi array boolean yang panjangnya sama dengan indeks atau kolom.
Catatan Khusus: ketika pengindeks skalar dilewatkan,
loc
dapat menetapkan nilai indeks atau kolom baru yang tidak ada sebelumnya.iloc
- Posisi berdasarkanMirip dengan
loc
kecuali dengan posisi bukan nilai indeks. Namun, Anda tidak dapat menetapkan kolom atau indeks baru.at
- Pekerjaan berbasis labelsangat mirip dengan
loc
untuk pengindeks skalar. Tidak dapat beroperasi pada pengindeks array. Bisa! menetapkan indeks dan kolom baru.Keuntungan lebih dari
loc
ini adalah bahwa ini lebih cepat.Kerugiannya adalah Anda tidak dapat menggunakan array untuk pengindeks.
iat
- Pekerjaan berbasis posisimirip dengan
iloc
. Tidak dapat bekerja di pengindeks array. Tidak bisa! menetapkan indeks dan kolom baru.Keuntungan lebih dari
iloc
ini adalah bahwa ini lebih cepat.Kerugiannya adalah Anda tidak dapat menggunakan array untuk pengindeks.
set_value
- Pekerjaan berbasis labelsangat mirip dengan
loc
untuk pengindeks skalar. Tidak dapat beroperasi pada pengindeks array. Bisa! menetapkan indeks dan kolom baruKeuntungan Super cepat, karena ada sedikit overhead!
Kerugian Ada sedikit overhead karena
pandas
tidak melakukan banyak pemeriksaan keamanan. Gunakan dengan risiko Anda sendiri . Juga, ini tidak dimaksudkan untuk penggunaan umum.set_value
dengantakable=True
- posisi berdasarkanPekerjaan mirip dengan
iloc
. Tidak dapat bekerja di pengindeks array. Tidak bisa! menetapkan indeks dan kolom baru.Keuntungan Super cepat, karena ada sedikit overhead!
Kerugian Ada sedikit overhead karena
pandas
tidak melakukan banyak pemeriksaan keamanan. Gunakan dengan risiko Anda sendiri . Juga, ini tidak dimaksudkan untuk penggunaan umum.sumber
set_value
telah ditinggalkan mendukung.at
dan.iat
sejak versi 0.21Ada dua cara utama panda menentukan pilihan dari DataFrame.
Dokumentasi menggunakan istilah posisi untuk merujuk ke lokasi integer . Saya tidak suka terminologi ini karena saya merasa itu membingungkan. Lokasi integer lebih deskriptif dan tepat untuk apa
.iloc
. Kata kuncinya di sini adalah INTEGER - Anda harus menggunakan bilangan bulat saat memilih berdasarkan lokasi bilangan bulat.Sebelum menampilkan ringkasan, mari kita semua memastikan bahwa ...
.ix sudah usang dan ambigu dan tidak boleh digunakan
Ada tiga pengindeks utama untuk panda. Kami memiliki operator pengindeksan itu sendiri (kurung
[]
).loc
,, dan.iloc
. Mari kita simpulkan mereka:[]
- Terutama memilih himpunan bagian kolom, tetapi dapat memilih baris juga. Tidak dapat secara bersamaan memilih baris dan kolom..loc
- memilih himpunan bagian baris dan kolom dengan label saja.iloc
- memilih himpunan bagian baris dan kolom dengan lokasi integer sajaSaya hampir tidak pernah menggunakan
.at
atau.iat
karena mereka tidak menambahkan fungsionalitas tambahan dan hanya dengan sedikit peningkatan kinerja. Saya akan melarang penggunaannya kecuali jika Anda memiliki aplikasi yang sangat sensitif waktu. Apapun, kami memiliki ringkasannya:.at
memilih nilai skalar tunggal dalam DataFrame hanya dengan label.iat
memilih nilai skalar tunggal dalam DataFrame hanya dengan lokasi integerSelain pemilihan berdasarkan label dan lokasi integer, pemilihan boolean juga dikenal sebagai pengindeksan boolean .
Contoh menjelaskan
.loc
,,.iloc
seleksi boolean dan.at
dan.iat
ditunjukkan di bawah iniKami pertama-tama akan fokus pada perbedaan antara
.loc
dan.iloc
. Sebelum kita berbicara tentang perbedaan, penting untuk memahami bahwa DataFrames memiliki label yang membantu mengidentifikasi setiap kolom dan setiap baris. Mari kita lihat contoh DataFrame:Semua kata dalam huruf tebal adalah label. Label,
age
,color
,food
,height
,score
danstate
digunakan untuk kolom . Label lain,Jane
,Nick
,Aaron
,Penelope
,Dean
,Christina
,Cornelia
digunakan sebagai label untuk baris. Secara kolektif, label baris ini dikenal sebagai indeks .Cara utama untuk memilih baris tertentu dalam DataFrame adalah dengan
.loc
dan.iloc
pengindeks. Masing-masing pengindeks ini juga dapat digunakan untuk secara bersamaan memilih kolom tetapi lebih mudah untuk hanya fokus pada baris untuk saat ini. Juga, masing-masing pengindeks menggunakan seperangkat tanda kurung yang segera mengikuti nama mereka untuk membuat pilihan mereka..loc memilih data hanya dengan label
Pertama-tama kita akan berbicara tentang
.loc
pengindeks yang hanya memilih data dengan indeks atau label kolom. Dalam DataFrame sampel kami, kami telah memberikan nama yang berarti sebagai nilai untuk indeks. Banyak DataFrames tidak akan memiliki nama yang berarti dan sebaliknya, default ke hanya bilangan bulat dari 0 hingga n-1, di mana n adalah panjang (jumlah baris) dari DataFrame.Ada banyak input berbeda yang dapat Anda gunakan untuk
.loc
tiga dari merekaMemilih satu baris dengan .loc dengan sebuah string
Untuk memilih satu baris data, letakkan label indeks di dalam tanda kurung berikut
.loc
.Ini mengembalikan baris data sebagai Seri
Memilih beberapa baris dengan .loc dengan daftar string
Ini mengembalikan DataFrame dengan baris dalam urutan yang ditentukan dalam daftar:
Memilih beberapa baris dengan .loc dengan notasi slice
Notasi irisan didefinisikan oleh nilai awal, berhenti dan langkah. Saat mengiris dengan label, panda menyertakan nilai stop dalam pengembalian. Berikut irisan dari Harun ke Dean, inklusif. Ukuran langkahnya tidak ditentukan secara eksplisit tetapi default ke 1.
Irisan kompleks dapat diambil dengan cara yang sama seperti daftar Python.
.iloc memilih data hanya dengan lokasi integer
Sekarang mari kita beralih ke
.iloc
. Setiap baris dan kolom data dalam DataFrame memiliki lokasi integer yang mendefinisikannya. Ini merupakan tambahan untuk label yang ditampilkan secara visual dalam output. Lokasi integer hanyalah jumlah baris / kolom dari atas / kiri mulai dari 0.Ada banyak input berbeda yang dapat Anda gunakan untuk
.iloc
tiga dari merekaMemilih satu baris dengan .iloc dengan integer
Ini mengembalikan baris ke-5 (lokasi integer 4) sebagai Seri
Memilih beberapa baris dengan .iloc dengan daftar bilangan bulat
Ini mengembalikan DataFrame dari baris ketiga dan kedua ke terakhir:
Memilih beberapa baris dengan .iloc dengan notasi slice
Pemilihan baris dan kolom secara simultan dengan .loc dan .iloc
Satu kemampuan luar biasa dari keduanya
.loc/.iloc
adalah kemampuan mereka untuk memilih baris dan kolom secara bersamaan. Dalam contoh di atas, semua kolom dikembalikan dari setiap pilihan. Kita dapat memilih kolom dengan tipe input yang sama seperti yang kita lakukan untuk baris. Kita hanya perlu memisahkan pemilihan baris dan kolom dengan koma .Misalnya, kita dapat memilih baris Jane, dan Dean hanya dengan tinggi kolom, skor, dan status seperti ini:
Ini menggunakan daftar label untuk baris dan notasi irisan untuk kolom
Kami secara alami dapat melakukan operasi serupa dengan
.iloc
hanya menggunakan bilangan bulat.Pilihan serentak dengan label dan lokasi integer
.ix
digunakan untuk membuat pilihan secara bersamaan dengan label dan lokasi integer yang berguna tetapi membingungkan dan ambigu pada waktu dan untungnya itu sudah usang. Jika Anda perlu membuat pilihan dengan campuran label dan lokasi integer, Anda harus membuat label pilihan atau lokasi integer Anda.Misalnya, jika kita ingin memilih baris
Nick
danCornelia
bersama dengan kolom 2 dan 4, kita bisa menggunakan.loc
dengan mengubah bilangan bulat menjadi label dengan yang berikut ini:Atau sebagai alternatif, ubah label indeks menjadi bilangan bulat dengan
get_loc
metode indeks.Seleksi Boolean
Pengindeks .loc juga dapat melakukan seleksi boolean. Misalnya, jika kita tertarik untuk menemukan semua baris di mana usia di atas 30 dan mengembalikan hanya kolom
food
danscore
kita dapat melakukan hal berikut:Anda dapat meniru ini dengan
.iloc
tetapi Anda tidak bisa mengirimkannya seri boolean. Anda harus mengubah Seri boolean menjadi array numpy seperti ini:Memilih semua baris
Dimungkinkan untuk digunakan
.loc/.iloc
hanya untuk pemilihan kolom. Anda dapat memilih semua baris dengan menggunakan titik dua seperti ini:Operator pengindeksan
[]
,, dapat mengiris dapat memilih baris dan kolom juga tetapi tidak secara bersamaan.Kebanyakan orang akrab dengan tujuan utama operator pengindeksan DataFrame, yaitu untuk memilih kolom. Sebuah string memilih kolom tunggal sebagai Seri dan daftar string memilih beberapa kolom sebagai DataFrame.
Menggunakan daftar memilih banyak kolom
Apa yang kurang dikenal orang adalah, ketika notasi slice digunakan, maka seleksi terjadi oleh label baris atau dengan lokasi integer. Ini sangat membingungkan dan sesuatu yang hampir tidak pernah saya gunakan tetapi berhasil.
Ketertarikan
.loc/.iloc
untuk memilih baris sangat disukai. Operator pengindeksan saja tidak dapat memilih baris dan kolom secara bersamaan.Seleksi oleh
.at
dan.iat
Seleksi dengan
.at
hampir identik dengan.loc
tetapi hanya memilih satu 'sel' di DataFrame Anda. Kami biasanya menyebut sel ini sebagai nilai skalar. Untuk menggunakannya.at
, berikan label baris dan kolom yang dipisahkan dengan koma.Seleksi dengan
.iat
hampir identik dengan.iloc
tetapi hanya memilih nilai skalar tunggal. Anda harus memberikan bilangan bulat untuk lokasi baris dan kolomsumber
sumber
Mari kita mulai dengan df kecil ini:
Kami akan melakukannya
Dengan ini kami memiliki:
Jadi kita tidak bisa menggunakan .iat untuk subset, di mana kita harus menggunakan .iloc saja.
Tapi mari kita coba keduanya untuk memilih dari df yang lebih besar dan mari kita periksa kecepatan ...
Jadi dengan .loc kita dapat mengatur subset dan dengan .at hanya satu skalar, tetapi .at lebih cepat dari .loc
:-)
sumber