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:
df = pd.DataFrame({'age':[30, 2, 12, 4, 32, 33, 69],
'color':['blue', 'green', 'red', 'white', 'gray', 'black', 'red'],
'food':['Steak', 'Lamb', 'Mango', 'Apple', 'Cheese', 'Melon', 'Beans'],
'height':[165, 70, 120, 80, 180, 172, 150],
'score':[4.6, 8.3, 9.0, 3.3, 1.8, 9.5, 2.2],
'state':['NY', 'TX', 'FL', 'AL', 'AK', 'TX', 'TX']
},
index=['Jane', 'Nick', 'Aaron', 'Penelope', 'Dean', 'Christina', 'Cornelia'])
Semua kata dalam huruf tebal adalah label. Label, age
, color
, food
, height
, score
dan state
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
- Sebuah benang
- Daftar string
- Notasi irisan menggunakan string sebagai nilai awal dan berhenti
Memilih satu baris dengan .loc dengan sebuah string
Untuk memilih satu baris data, letakkan label indeks di dalam tanda kurung berikut .loc
.
df.loc['Penelope']
Ini mengembalikan baris data sebagai Seri
age 4
color white
food Apple
height 80
score 3.3
state AL
Name: Penelope, dtype: object
Memilih beberapa baris dengan .loc dengan daftar string
df.loc[['Cornelia', 'Jane', 'Dean']]
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.
df.loc['Aaron':'Dean']
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
- Bilangan bulat
- Daftar bilangan bulat
- Notasi irisan menggunakan bilangan bulat sebagai nilai awal dan berhenti
Memilih satu baris dengan .iloc dengan integer
df.iloc[4]
Ini mengembalikan baris ke-5 (lokasi integer 4) sebagai Seri
age 32
color gray
food Cheese
height 180
score 1.8
state AK
Name: Dean, dtype: object
Memilih beberapa baris dengan .iloc dengan daftar bilangan bulat
df.iloc[[2, -2]]
Ini mengembalikan DataFrame dari baris ketiga dan kedua ke terakhir:
Memilih beberapa baris dengan .iloc dengan notasi slice
df.iloc[:5:3]
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:
df.loc[['Jane', 'Dean'], 'height':]
Ini menggunakan daftar label untuk baris dan notasi irisan untuk kolom
Kami secara alami dapat melakukan operasi serupa dengan .iloc
hanya menggunakan bilangan bulat.
df.iloc[[1,4], 2]
Nick Lamb
Dean Cheese
Name: food, dtype: object
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
dan Cornelia
bersama dengan kolom 2 dan 4, kita bisa menggunakan .loc
dengan mengubah bilangan bulat menjadi label dengan yang berikut:
col_names = df.columns[[2, 4]]
df.loc[['Nick', 'Cornelia'], col_names]
Atau sebagai alternatif, ubah label indeks menjadi bilangan bulat dengan get_loc
metode indeks.
labels = ['Nick', 'Cornelia']
index_ints = [df.index.get_loc(label) for label in labels]
df.iloc[index_ints, [2, 4]]
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
dan score
kita dapat melakukan hal berikut:
df.loc[df['age'] > 30, ['food', 'score']]
Anda dapat meniru ini dengan .iloc
tetapi Anda tidak bisa mengirimkannya seri boolean. Anda harus mengubah Seri boolean menjadi array numpy seperti ini:
df.iloc[(df['age'] > 30).values, [2, 4]]
Memilih semua baris
Dimungkinkan untuk digunakan .loc/.iloc
hanya untuk pemilihan kolom. Anda dapat memilih semua baris dengan menggunakan titik dua seperti ini:
df.loc[:, 'color':'score':2]
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.
df['food']
Jane Steak
Nick Lamb
Aaron Mango
Penelope Apple
Dean Cheese
Christina Melon
Cornelia Beans
Name: food, dtype: object
Menggunakan daftar memilih banyak kolom
df[['food', 'score']]
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.
df['Penelope':'Christina'] # slice rows by label
df[2:6:2] # slice rows by integer location
Ketertarikan .loc/.iloc
untuk memilih baris sangat disukai. Operator pengindeksan saja tidak dapat memilih baris dan kolom secara bersamaan.
df[3:5, 'color']
TypeError: unhashable type: 'slice'