Garfield
YZF Admin
Temel fark: etiket ve sıra numarası
Pandas’ta
loc satır ve sütunları adlarına, yani etiketlerine göre seçer; iloc ise satır ve sütunların sayısal konumunu kullanır. Bu nedenle seçim ölçütünüz bir indeks veya sütun adıysa loc, “kaçıncı satır ve sütun?” diye düşünüyorsanız iloc kullanmalısınız. Aynı veri üzerinde iki yöntemi karşılaştırarak doğru sonucu hemen görebilirsiniz.
Python:
import pandas as pd
df = pd.DataFrame(
{
"ad": ["Ali", "Buse", "Cem"],
"puan": [85, 92, 78]
},
index=["ogrenci_1", "ogrenci_2", "ogrenci_3"]
)
print(df.loc["ogrenci_2", "puan"])
print(df.iloc[1, 1])
Her iki ifade de varsayımsal bu veri üzerinde
92 sonucunu verir. Ancak loc["ogrenci_2", "puan"] etiketi, iloc[1, 1] ise ikinci satır ve ikinci sütunun sırasını kullanır.loc ve iloc karşılaştırması
İki yöntemin temel farkları seçim biçiminde ve dilimleme davranışında ortaya çıkar:
| Ölçüt | loc | iloc |
|---|---|---|
| Seçim türü | Satır ve sütun etiketleriyle seçim yapar. | Sıfırdan başlayan sayısal konumlarla seçim yapar. |
| Satır örneği | df.loc["ogrenci_2"] | df.iloc[1] |
| Sütun örneği | df.loc[:, "puan"] | df.iloc[:, 1] |
| Dilimleme | Etiket aralığının bitişini genellikle dahil eder. | Python dilimlemesi gibi bitiş konumunu dahil etmez. |
| Uygun kullanım | Anlamlı indeks veya sütun adlarıyla çalışırken. | Verinin fiziksel sıra konumuyla çalışırken. |
df.loc["ogrenci_1":"ogrenci_2"] iki öğrenciyi de seçer; çünkü loc etiket diliminde bitiş etiketi dahildir. df.iloc[0:2] de ilk iki satırı seçer, fakat burada 2 konumundaki satır seçime katılmaz.Sütun ve satır seçimi
loc ile etiketleri açıkça belirtebilirsiniz:
Python:
adlar = df.loc[:, "ad"]
ilk_iki_sutun = df.loc[:, ["ad", "puan"]]
ikinci_ogrenci = df.loc["ogrenci_2", :]
İki nokta üst üste işareti
:, ilgili eksendeki tüm değerleri ifade eder. df.loc[:, "ad"] bütün satırlardan ad sütununu alır. iloc ile aynı seçim sütunun konumuna göre yazılır:
Python:
adlar = df.iloc[:, 0]
ilk_iki_sutun = df.iloc[:, 0:2]
ikinci_ogrenci = df.iloc[1, :]
Burada sütunların sırası değişirse
iloc[:, 0] artık ad sütununu göstermeyebilir. Buna karşılık sütun adı değişmediği sürece loc[:, "ad"] aynı sütunu hedefler. Bu nedenle kalıcı ve okunabilir kodda, belirli bir sütunu adıyla seçmek çoğu zaman daha güvenlidir.Koşula göre seçimde loc kullanımı
Bir koşula uyan satırları seçerken genellikle
loc tercih edilir. Örneğin puanı 80’den yüksek öğrencileri ve yalnızca ad ile puan sütunlarını almak için:
Python:
sonuc = df.loc[df["puan"] > 80, ["ad", "puan"]]
print(sonuc)
Beklenen çıktı şöyledir:
Kod:
ad puan
ogrenci_1 Ali 85
ogrenci_2 Buse 92
Buradaki
df["puan"] > 80 ifadesi her satır için True veya False üretir. loc yalnızca True olan satırları seçer. Bu kullanım, koşulun hangi sütuna dayandığını açıkça gösterdiği için iloc ile konumları elle hesaplamaktan daha anlaşılırdır.Hangisini ne zaman seçmelisiniz?
İndeks veya sütun adlarının anlamına güveniyorsanız
loc kullanın. Örneğin belirli bir müşteriyi müşteri numarasıyla bulmak, bir koşula uyan kayıtları seçmek veya adı değişmeyecek bir sütunu almak için uygundur.Yalnızca konum önem taşıyorsa
iloc kullanın. Örneğin ilk satırı almak için df.iloc[0], son sütunu almak için df.iloc[:, -1] yazabilirsiniz. Ancak veri sıralanır, satır eklenir veya sütunların yeri değişirse sayısal konuma dayalı kod farklı bir kaydı seçebilir.Kısa kural: Etiketle seçiyorsanız
loc, konumla seçiyorsanız iloc. Bir sütunun adını biliyor ve veri düzeni değişebiliyorsa, sütun numarasını sabitlemek yerine loc kullanmak daha güvenli bir seçimdir.Sık karıştırılan durum: etiket ile konum aynı olmak zorunda değildir
İndeks etiketleri sayılardan oluşsa bile bunlar otomatik olarak konum anlamına gelmez:
Python:
df2 = pd.DataFrame(
{"deger": [10, 20, 30]},
index=[10, 20, 30]
)
print(df2.loc[20, "deger"])
print(df2.iloc[1, 0])
Her iki ifade de
20 sonucunu verir; fakat nedenleri farklıdır. loc[20, "deger"], etiketi 20 olan satırı seçer. iloc[1, 0] ise ikinci satırın ve ilk sütunun konumunu seçer. İndeks etiketleri 100, 200, 300 olsaydı loc[20] çalışmazdı; ikinci satırı yine iloc[1] ile seçebilirdiniz.Ayrıca
loc ile olmayan bir etiket istenirse etiket bulunamadığına ilişkin hata alabilirsiniz; iloc ile veri sınırının dışındaki bir konum istenirse konum aralığı hatası oluşur. Böyle bir durumda önce df.index, df.columns ve df.shape değerlerini yazdırarak kullandığınız etiketlerin veya konumların gerçekten mevcut olduğunu kontrol edin.