Adakah yang bisa menjelaskan bagaimana ketiga metode mengiris ini berbeda?
Saya telah melihat dokumen , dan saya telah melihat jawaban ini , tetapi saya masih tidak dapat menjelaskan bagaimana ketiganya berbeda. Bagi saya, mereka tampaknya dapat dipertukarkan sebagian besar, karena mereka berada di tingkat yang lebih rendah.
Misalnya, kita ingin mendapatkan lima baris pertama a DataFrame
. Bagaimana bisa ketiganya bekerja?
df.loc[:5]
df.ix[:5]
df.iloc[:5]
Bisakah seseorang menyajikan tiga kasus di mana perbedaan dalam penggunaannya lebih jelas?
Jawaban:
Catatan: dalam versi panda 0.20.0 dan di atasnya,
ix
sudah usang dan penggunaanloc
daniloc
dianjurkan sebagai gantinya. Saya telah meninggalkan bagian dari jawaban ini yang menggambarkanix
utuh sebagai referensi untuk pengguna versi panda sebelumnya. Contoh telah ditambahkan di bawah ini yang menunjukkan alternatif untukix
.Pertama, inilah rekap dari tiga metode:
loc
mendapat baris (atau kolom) dengan label tertentu dari indeks.iloc
mendapat baris (atau kolom) pada posisi tertentu dalam indeks (sehingga hanya membutuhkan bilangan bulat).ix
biasanya mencoba berperilaku sepertiloc
tetapi kembali berperilaku sepertiiloc
jika label tidak ada dalam indeks.Penting untuk mencatat beberapa seluk-beluk yang dapat membuat
ix
sedikit sulit untuk digunakan:jika indeks adalah tipe integer,
ix
hanya akan menggunakan pengindeksan berbasis label dan tidak jatuh kembali ke pengindeksan berbasis posisi. Jika label tidak ada dalam indeks, kesalahan akan muncul.jika indeks tidak hanya berisi bilangan bulat, maka diberikan bilangan bulat,
ix
akan segera menggunakan pengindeksan berbasis posisi daripada pengindeksan berbasis label. Namun jikaix
diberikan jenis lain (misalnya string), itu dapat menggunakan pengindeksan berbasis label.Untuk mengilustrasikan perbedaan antara ketiga metode, pertimbangkan Seri berikut:
Kita akan melihat slicing dengan nilai integer
3
.Dalam hal ini,
s.iloc[:3]
kembalikan 3 baris pertama (karena memperlakukan 3 sebagai posisi) dans.loc[:3]
mengembalikan 8 baris pertama (karena memperlakukan 3 sebagai label):Pemberitahuan
s.ix[:3]
mengembalikan Seri yang sama sepertis.loc[:3]
karena mencari label terlebih dahulu daripada bekerja pada posisi (dan indeks untuks
tipe integer).Bagaimana jika kita mencoba dengan label integer yang tidak ada dalam indeks (katakanlah
6
)?Di sini
s.iloc[:6]
mengembalikan 6 baris pertama Seri seperti yang diharapkan. Namun,s.loc[:6]
memunculkan KeyError karena6
tidak ada dalam indeks.Sesuai dengan seluk-beluk yang disebutkan di atas,
s.ix[:6]
sekarang memunculkan KeyError karena mencoba bekerja sepertiloc
tetapi tidak dapat menemukan6
dalam indeks. Karena indeks kami bertipe integerix
, jangan kembali seperti apailoc
.Namun, jika indeks kami adalah tipe campuran, diberi bilangan bulat
ix
akan berperilaku sepertiiloc
segera daripada menaikkan KeyError:Ingatlah bahwa
ix
masih dapat menerima yang bukan bilangan bulat dan berperilaku sepertiloc
:Sebagai saran umum, jika Anda hanya mengindeks menggunakan label, atau hanya mengindeks menggunakan posisi integer, tetap dengan
loc
atauiloc
untuk menghindari hasil yang tidak terduga - cobalah untuk tidak menggunakannyaix
.Menggabungkan pengindeksan berbasis posisi dan berbasis label
Terkadang diberi DataFrame, Anda akan ingin mencampur metode pengindeksan label dan posisi untuk baris dan kolom.
Misalnya, pertimbangkan DataFrame berikut. Cara terbaik untuk mengiris baris hingga dan termasuk 'c' dan mengambil empat kolom pertama?
Dalam versi panda sebelumnya (sebelum 0.20.0)
ix
memungkinkan Anda melakukan ini dengan cukup rapi - kita dapat mengiris baris dengan label dan kolom dengan posisi (perhatikan bahwa untuk kolom,ix
akan secara default untuk pengirisan berbasis posisi karena4
bukan nama kolom ):Di versi panda nanti, kita dapat mencapai hasil ini menggunakan
iloc
dan bantuan metode lain:get_loc()
adalah metode indeks yang berarti "dapatkan posisi label dalam indeks ini". Perhatikan bahwa karena mengiris denganiloc
eksklusif dari titik akhir, kita harus menambahkan 1 ke nilai ini jika kita ingin baris 'c' juga.Ada contoh lebih lanjut dalam dokumentasi panda di sini .
sumber
loc
,iloc
danix
mungkin masih memicu peringatan jika dirantai bersama. Menggunakan contoh DataFrame di dokumen yang ditautkandfmi.loc[:, 'one'].loc[:, 'second']
memicu peringatan sepertidfmi['one']['second']
karena salinan data (bukan tampilan) mungkin dikembalikan oleh operasi pengindeksan pertama.df.ix[date, 'Cash']
?loc
atauix
harus berfungsi dalam kasus itu. Misalnya,df.loc['2016-04-29', 'Cash']
akan mengembalikan semua indeks baris dengan tanggal tertentu dari kolom 'Uang'. (Anda dapat sespesifik mungkin ketika mengambil indeks dengan string, mis.'2016-01'
Akan memilih semua datetimes yang jatuh pada Januari 2016, `'2016-01-02 11' akan memilih datetimes pada 2 Januari 2016 dengan waktu 11: ??: ?? .)iloc
bekerja berdasarkan positioning integer. Jadi, apa pun label baris Anda, Anda selalu dapat, mis. Mendapatkan baris pertama dengan melakukanatau lima baris terakhir dengan melakukan
Anda juga dapat menggunakannya di kolom. Ini mengambil kolom ke-3:
Anda bisa menggabungkannya untuk mendapatkan persimpangan baris dan kolom:
Di sisi lain,
.loc
gunakan indeks bernama. Mari kita menyiapkan bingkai data dengan string sebagai label baris dan kolom:Lalu kita bisa mendapatkan baris pertama
dan dua baris
'date'
kolom kedua olehdan seterusnya. Sekarang, mungkin perlu menunjukkan bahwa indeks baris dan kolom default untuk
DataFrame
adalah bilangan bulat dari 0 dan dalam kasus iniiloc
danloc
akan bekerja dengan cara yang sama. Inilah sebabnya tiga contoh Anda setara. Jika Anda memiliki indeks non-numerik seperti string atau datetimes,df.loc[:5]
akan memunculkan kesalahan.Anda juga dapat melakukan pengambilan kolom hanya dengan menggunakan kerangka data
__getitem__
:Sekarang anggaplah Anda ingin mencampur posisi dan bernama pengindeksan, yaitu pengindeksan menggunakan nama pada baris dan posisi pada kolom (untuk memperjelas, maksud saya pilih dari bingkai data kami, daripada membuat bingkai data dengan string dalam indeks baris dan bilangan bulat di indeks kolom). Di sinilah
.ix
masuk:Saya pikir itu juga layak disebutkan bahwa Anda dapat melewati vektor boolean ke
loc
metode juga. Sebagai contoh:Akan mengembalikan baris 1 dan 3
df
. Ini sama dengandf[b]
untuk seleksi, tetapi juga dapat digunakan untuk menetapkan melalui vektor boolean:sumber
df.loc[:, :]
. Ini dapat digunakan untuk menetapkan kembali nilai-nilai keseluruhanDataFrame
atau membuat tampilan itu.Menurut pendapat saya, jawaban yang diterima membingungkan, karena menggunakan DataFrame dengan hanya nilai yang hilang. Saya juga tidak suka istilah berbasis posisi untuk
.iloc
dan sebagai gantinya, lebih suka lokasi integer karena jauh lebih deskriptif dan apa.iloc
kepanjangannya. Kata kuncinya adalah INTEGER -.iloc
membutuhkan INTEGER.Lihat seri blog saya yang sangat terperinci tentang pemilihan subset untuk informasi lebih lanjut
.ix sudah usang dan ambigu dan tidak boleh digunakan
Karena
.ix
sudah usang kami hanya 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 indeks. 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 untuk 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 ke n-1, di mana n adalah panjang dari DataFrame.Ada tiga input berbeda yang dapat Anda gunakan
.loc
Memilih 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 tiga input berbeda yang dapat Anda gunakan
.iloc
Memilih 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 .Sebagai contoh, 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:Atau sebagai alternatif, ubah label indeks menjadi bilangan bulat dengan
get_loc
metode indeks.Seleksi Boolean
Pengindeks .loc juga dapat melakukan seleksi boolean. Sebagai contoh, 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 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.sumber