loc mu iloc mu? Pandas'ta Satır ve Sütun Seçiminin İki Yolu
loc "adı bu olan satırı getir", iloc "şu sıradaki satırı getir" der. Sıralama, filtreleme ya da birleştirme sonrasında etiketle sıra birbirinden ayrıldığında bu fark, sessizce yanlış veri seçmekle doğru veriyi seçmek arasındaki farka dönüşür.
Bir bakışta
- loc etiketle, iloc tam sayı konumla seçer. İndeksiniz tam sayılardan oluşsa bile loc bu sayıları konum olarak değil etiket olarak okur.
- loc dilimlerinde bitiş etiketi dahildir, iloc dilimlerinde bitiş konumu hariçtir. pandas belgesi bunu açıkça vurgular; iloc Python'un ve NumPy'nin olağan dilim kuralına uyar.
- Koşullu seçim ve değer atamada doğal araç loc'tur. Satır koşulu ile sütun adı tek bir loc çağrısında birlikte verilir; zincirleme atamadan kaçınılır.
- Sıralama ya da filtreleme sonrası iloc'un gösterdiği satır değişir, loc'unki değişmez. Belirli bir kayda bağlı işlemlerde etiket, sıraya bağlı işlemlerde konum kullanılır.
Aynı tablo, iki seçim mantığı
Pandas'ta bir DataFrame'in satırlarının bir indeksi, sütunlarının da adları vardır. Bu adlara etiket denir. Satırların ayrıca bir sırası, yani konumu vardır: ilk satırın konumu sıfırdır. loc ve iloc, aynı tablodan satır ve sütun seçmenin bu iki yolunu temsil eder.
pandas kullanıcı kılavuzuna göre loc öncelikle etiket tabanlıdır, mantıksal bir diziyle de kullanılabilir ve istenen etiket bulunamazsa KeyError verir. iloc ise öncelikle tam sayı konum tabanlıdır, sıfırdan eksenin uzunluğunun bir eksiğine kadar olan konumlarla çalışır, mantıksal diziyle de kullanılabilir ve sınır dışındaki bir konum istenirse IndexError verir; yalnız dilimlerde sınır dışına taşmaya izin verilir.
İki yöntem de köşeli parantez içinde önce satır, virgülden sonra sütun seçimini alır. Fark, parantezin içine yazdığınız değerin neyi temsil ettiğindedir: loc'ta bir ad, iloc'ta bir sıra numarası.
Örnek tablo üzerinde iki yöntem
Müşteri numarasının indeks olduğu küçük bir tablo düşünelim: satır etiketleri 101, 102, 103 ve 104; sütunlar ad, il ve tutar.
Tek bir satır seçmek: df.loc[102] satır etiketi 102 olan müşteriyi getirir. df.iloc[1] konumu 1 olan, yani tablonun ikinci satırını getirir. Tablo şu anki sırasındayken ikisi aynı müşteriyi gösterir. Ancak tablo tutara göre sıralanırsa df.loc[102] yine aynı müşteriyi, df.iloc[1] ise sıralamada ikinci gelen başka bir müşteriyi getirir.
Aralık seçmek: df.loc[101:103] etiketleri 101, 102 ve 103 olan satırları getirir; bitiş etiketi dahildir. df.iloc[0:2] konumu 0 ve 1 olan satırları getirir; bitiş konumu hariçtir.
Satır ve sütunu birlikte seçmek: df.loc[102, "tutar"] müşteri 102'nin tutarını verir. df.iloc[:, 0] tüm satırların ilk sütununu verir. df.loc[df["tutar"] > 500, "ad"] tutarı 500'den büyük müşterilerin adlarını verir. Koşul bir mantıksal dizi üretir, loc bu diziyle satırları, sütun adıyla da sütunu seçer.
Temel farklar ölçüt ölçüt
- Seçim ölçütü: loc, satır ve sütun etiketleri / iloc, sıfırdan başlayan tam sayı konumlar.
- Dilim bitişi: loc, bitiş etiketi dahildir / iloc, bitiş konumu hariçtir.
- Bulunamayan değer: loc, KeyError verir / iloc, sınır dışı tek konumda IndexError verir, dilimde taşmaya izin verir.
- Tam sayı indeksli tabloda: loc, tam sayıları etiket olarak okur / iloc, tam sayıları her zaman konum olarak okur.
- Koşullu seçim: loc, mantıksal diziyle doğal biçimde çalışır / iloc, mantıksal dizi kabul eder ama koşul ifadesi doğrudan bir pandas Series olarak değil, değerler dizisi olarak verilmelidir.
- Değer atama: loc, koşul ve sütun adıyla güvenli atama için önerilen yoldur / iloc, sıraya bağlı atamalarda kullanılır.
- Sıralamadan etkilenme: loc, sıralama ve filtreleme sonrasında aynı kaydı gösterir / iloc, sıralama sonrasında farklı kaydı gösterebilir.
Dört temel kullanım
Seçim türü ve seçim ölçütü bir araya getirildiğinde dört temel durum çıkar.
Tek bir satırı adıyla seçmek için loc kullanılır: df.loc[102] gibi. Bu kullanım, belirli bir kayda bağlı işlemler için güvenlidir; tablo sıralansa da aynı kaydı bulur.
Tek bir satırı sırasıyla seçmek için iloc kullanılır: df.iloc[0] tablonun ilk satırını, df.iloc[-1] son satırını getirir. Sıralanmış bir tablonun en üstteki ya da en alttaki kaydını almak gibi sıraya bağlı işlerde doğru araçtır.
Bir aralığı etiketlerle seçmek için loc dilimi kullanılır ve bitiş dahildir. Tarih indeksli verilerde bir dönemin tamamını almak için bu davranış doğaldır: dönemin son günü de sonuca girer.
Bir aralığı konumlarla seçmek için iloc dilimi kullanılır ve bitiş hariçtir. İlk birkaç satırı almak, veriyi eğitim ve test parçalarına bölmek gibi işlerde kullanılır.
Ad mı sıra mı ve tek değer mi aralık mı: dört kullanım
Sık yapılan hatalar ve doğrusu
Bu iki yöntemle yapılan hataların ortak özelliği sessiz olmalarıdır: kod hata vermeden çalışır ama yanlış satırları seçer.
- Tam sayı indeksli tabloda loc'u konum sanmak. Filtrelemeden sonra indeks 101, 104 gibi atlamalı kalır; df.loc[0] bulunamaz ya da beklenmeyen bir satırı getirir. Konum isteniyorsa iloc kullanılır ya da indeks reset_index ile yeniden düzenlenir.
- Dilim bitişini karıştırmak. Dönem seçerken iloc kullanıp son günü kaybetmek ya da ilk birkaç satırı alırken loc kullanıp bir satır fazla almak sık görülür.
- Sıralamadan sonra iloc ile belirli bir kaydı aramak. Belirli bir müşteri, ürün ya da tarih aranıyorsa etiket kullanılır.
- Zincirleme atama yapmak: önce satırları filtreleyip sonra sütuna değer atamak, değişikliğin asıl tabloya yansımamasına yol açar; pandas'ın Copy-on-Write davranışında bu tür atama asıl tabloyu hiçbir zaman değiştirmez. Atama tek bir loc çağrısında, koşul ve sütun adı birlikte verilerek yapılır.
- iloc'a sütun adı vermek. iloc yalnız konum kabul eder; sütun adıyla çalışılacaksa loc kullanılır ya da sütunun konumu columns.get_loc ile bulunur.
Hatalar sessizdir: kod çalışır ama yanlış satırı seçer
Hangisini ne zaman seçmeli?
Kısa bir kural işe yarar: seçtiğiniz şeyin bir adı varsa loc, yalnız bir sırası varsa iloc.
- Belirli bir müşteri, ürün, tarih ya da sütun adı üzerinden çalışıyorsanız loc kullanın. Kod okunur olur ve tablo sıralandığında ya da filtrelendiğinde doğru kaydı seçmeye devam eder.
- Koşula göre satır seçiyor ya da değer atıyorsanız loc kullanın.
- Tablonun ilk ya da son satırları, her n'inci satır, rastgele örneklemden sonra belirli bir parça gibi sıraya bağlı işler yapıyorsanız iloc kullanın.
- Sütun adlarını bilmediğiniz ya da sütunların yalnız sırasının anlamlı olduğu bir dosyayla çalışıyorsanız iloc işinizi görür; ancak adları belli olduktan sonra loc'a geçmek kodu daha dayanıklı kılar.
İki yöntemi karıştırmanız gerekiyorsa, örneğin satırı koşulla, sütunu sırasıyla seçmek gibi, sütunun adını df.columns üzerinden alıp her şeyi loc ile yapmak, tek ifadede iki mantığı karıştırmaktan daha okunurdur.
Mindset programlarında pandas ile veri seçimi
Python ile Veri Analizi (Pandas) eğitimi, pandas temellerinden sonra veri temizleme, filtreleme, seçme ve koşullu sorgulama, gruplama ve pivot analizi ile veri birleştirmeye ilerler ve iş analitiği vakalarıyla tamamlanır. Excel'den Python'a geçen analistler ve raporlarını tekrar üretilebilir koda taşımak isteyen ekipler için uygundur.
Seçim ve filtreleme işlemlerini eksik ve hatalı veriyle başa çıkma bağlamında derinleştirmek isteyenler için Python ile Veri Temizleme eğitimi tamamlayıcıdır.
İlgili Mindset programı
Python ile Veri Analizi (Pandas)
Sık sorulan sorular
Köşeli parantezle doğrudan seçim, yani df[...] varken loc ve iloc neden gerekli?
df[...] tek başına kullanıldığında bağlama göre farklı davranır: bir sütun adı verilirse sütunu, bir dilim verilirse satırları, bir mantıksal dizi verilirse satırları seçer. Bu esneklik kısa kodda işe yarar ama hangi eksende ve hangi ölçütle seçim yapıldığını belirsizleştirir. loc ve iloc seçimin etiketle mi konumla mı yapıldığını açıkça söyler.
at ve iat ne işe yarar?
at ve iat, loc ve iloc'un tek bir hücreye erişmek için kullanılan karşılıklarıdır: at etiketle, iat konumla tek bir değeri okur ya da yazar. Bir döngü içinde çok sayıda tek hücreye erişilen durumlarda daha hafiftir. Birden çok satır ya da sütun seçilecekse loc ve iloc kullanılır.
loc ile yeni bir satır ya da sütun eklenebilir mi?
Evet. loc ile var olmayan bir sütun adına değer atandığında yeni sütun oluşur; var olmayan bir satır etiketine atama yapıldığında da yeni satır eklenir. iloc ise yalnız var olan konumlarla çalıştığı için yeni satır ya da sütun eklemez. Çok sayıda satır eklenecekse satırları tek tek eklemek yerine tabloları birleştirmek daha verimlidir.
Tarih indeksli verilerde hangisi kullanılmalı?
Tarih indeksli verilerde loc daha doğaldır. Bir tarih aralığı loc dilimiyle seçildiğinde bitiş tarihi de sonuca girer, böylece bir dönemin tamamı tek ifadeyle alınır. Tarih metin olarak da verilebilir ve pandas bunu indeksle eşleştirir. Son birkaç kaydı almak gibi sıraya bağlı işler için ise iloc ya da tail kullanılır.
SettingWithCopyWarning uyarısı ne oldu, zincirleme atama nasıl düzeltilir?
Bu uyarı pandas'ın eski sürümlerinde, filtrelenmiş bir parçaya değer atandığında atamanın asıl tabloya yansıyıp yansımayacağı belirsiz olduğu için görülürdü. pandas 3.0 ile Copy-on-Write varsayılan ve tek davranış oldu: zincirleme atama artık asıl tabloyu hiçbir zaman değiştirmez, SettingWithCopyWarning kaldırıldı ve bunun yerine ChainedAssignmentError uyarısı verilir. Çözüm her sürümde aynıdır: asıl tablo değiştirilecekse atama koşul ve sütun adıyla tek bir loc çağrısında yapılır.
İlgili rehberler
İlgili eğitimler
Kategori: Veri Analitiği ve İş Zekası