Pandas 05 - Eksik - Kayıp Veri Yöntemleri
Sal 12 Temmuz 2022Eksik / Kayıp Veri Tespiti ve Düzenleme Yöntemleri
Veri çerçevemizde eksik veri (excel tablosundaki boş hücre gibi düşünebiliriz) olup olmadığını, varsa kaç adet olduğunu tespit edebileceğimiz Pandas yöntemleri mevcuttur. Bunları incelemeye başlayalım.
isnull() Fonksiyonu
Veri çerçevemizde eksik verileri isnull() fonksiyonu ile tespit edebiliriz. isnull ifadesini, boş mu?, geçersiz mi?, kayıp/eksik mi? sorusu olarak düşünebilirsiniz. Hemen inceleyelim bakalım, acaba IMDB listemizde eksik veri var mı? varsa hangi sütunda ne kadar eksik veri var?
import pandas as pd
imdb = pd.read_excel("Veri_Setleri/imdb.xlsx")
print(imdb.isnull())
Film_Adı | Yıl | Puan | Oylayan_Kişi | |
---|---|---|---|---|
0 | False | False | False | False |
1 | False | False | False | False |
2 | False | False | False | False |
3 | False | False | False | False |
4 | False | False | False | False |
... | ... | ... | ... | ... |
242 | False | False | False | False |
243 | False | False | False | False |
244 | False | False | False | False |
245 | False | False | False | False |
246 | False | False | False | False |
247 rows × 4 columns
Görüldüğü üzere, bu fonksiyon, veri çerçevesindeki her hücreye, kayıp/eksik veri olup olmadığı verisini yazıyor. False Yanlış, yani Eksik/Kayıp veri YOK, True ise Doğru yan, Eksik/Kayıp veri VAR anlamına gelir. Tabloya tek tek bakmak yerine, tüm sütunlardaki eksik/kayıp verileri python'a saydırıp, sonucu görüntüleyebiliriz. Python'da aşina olduğumuz sum() fonksiyonu işimize yarayacaktır.
print(imdb.isnull().sum())
Film_Adı 0
Yıl 0
Puan 0
Oylayan_Kişi 0
dtype: int64
Gördüğümüz kadarıyla tüm sonuçlar sıfır, yani veri çerçevemizde hiç eksik/kayıp veri bulunmamaktadır.
İçerisinde Kayıp/Eksik veri olan bir Calc tablosunu, veri çerçevesine dönüştürerek inceleyelim.
veri = pd.read_excel("Veri_Setleri/eksik_veri.ods")
print(veri)
Film_Adı | Yıl | Puan | Oylayan_Kişi | |
---|---|---|---|---|
0 | The Shawshank Redemption | 1994.0 | 9,2 | 1071904.0 |
1 | The Godfather | 1972.0 | 9,2 | 751381.0 |
2 | The Godfather: Part II | 1974.0 | 9 | 488889.0 |
3 | Pulp Fiction | 1994.0 | 8,9 | 830504.0 |
4 | The Dark Knight | 2008.0 | 8,9 | 1045186.0 |
5 | 12 Angry Men | 1957.0 | 8,9 | NaN |
6 | Schindler's List | 1993.0 | 8,9 | 545703.0 |
7 | The Lord of the Rings: The Return of the King | 2003.0 | 8,8 | 758388.0 |
8 | Fight Club | 1999.0 | 8,8 | 814389.0 |
9 | Star Wars: Episode V - The Empire Strikes Back | 1980.0 | 8,8 | 519895.0 |
10 | The Lord of the Rings: The Fellowship of the R... | 2001.0 | 8,8 | 784999.0 |
11 | One Flew Over the Cuckoo's Nest | 1975.0 | 8,7 | 447005.0 |
12 | Goodfellas | 1990.0 | 8,7 | 465445.0 |
13 | Seven Samurai | NaN | 8,7 | 161969.0 |
14 | Inception | 2010.0 | 8,7 | 844938.0 |
15 | Star Wars | 1977.0 | 8,7 | NaN |
16 | Forrest Gump | 1994.0 | 8,7 | 711386.0 |
17 | The Matrix | 1999.0 | 8,7 | 770559.0 |
18 | The Lord of the Rings: The Two Towers | 2002.0 | 8,7 | 680983.0 |
isnull().sum() metodlarıyla, yeni veri çerçevemizdeki eksik verilerin bilgilerini görelim
print(veri.isnull().sum())
Film_Adı 0
Yıl 1
Puan 0
Oylayan_Kişi 2
dtype: int64
Yıl sütununda 1, Oylayan_Kişi sütununda 2 adet eksik veri olduğu görünüyor. Eksik veri olan satır ve sütunları silmeye / temizlemeye çalışalım.
dropna() Fonksiyonu
Veri çerçevelerinde istediğimiz satır ve sütunları drop() metodu yardımı ile nasıl silebildiğimizi burada anlatıyoruz.
Veri Çerçevelerinde eksik veri bulunan satır ve sütunları otomatik olarak silmek için dropna() metodunu kullanabiliriz. Metodun kullanım şekli aşağıdaki gibidir.
VeriÇerçevesi_Adı.dropna(axis = 0 ya da 1, inplace = True ya da False)
axis Parametresi
Eksenleri tanımlayan parametredir. Sıfır (0) Satırları, Bir (1) Sütunları temsil eder. Varsayılan değer Sıfır(0) yani Satırlardır.
inplace Parametresi
Gerçekleştirilen silme işleminin veri çerçevesinde kalıcı ya da geçici olmasını ayarladığımız parametredir. inplace = True yazılırsa, yapılan işlem kalıcı hale gelecektir.
print(veri.dropna())
Film_Adı | Yıl | Puan | Oylayan_Kişi | |
---|---|---|---|---|
0 | The Shawshank Redemption | 1994.0 | 9,2 | 1071904.0 |
1 | The Godfather | 1972.0 | 9,2 | 751381.0 |
2 | The Godfather: Part II | 1974.0 | 9 | 488889.0 |
3 | Pulp Fiction | 1994.0 | 8,9 | 830504.0 |
4 | The Dark Knight | 2008.0 | 8,9 | 1045186.0 |
6 | Schindler's List | 1993.0 | 8,9 | 545703.0 |
7 | The Lord of the Rings: The Return of the King | 2003.0 | 8,8 | 758388.0 |
8 | Fight Club | 1999.0 | 8,8 | 814389.0 |
9 | Star Wars: Episode V - The Empire Strikes Back | 1980.0 | 8,8 | 519895.0 |
10 | The Lord of the Rings: The Fellowship of the R... | 2001.0 | 8,8 | 784999.0 |
11 | One Flew Over the Cuckoo's Nest | 1975.0 | 8,7 | 447005.0 |
12 | Goodfellas | 1990.0 | 8,7 | 465445.0 |
14 | Inception | 2010.0 | 8,7 | 844938.0 |
16 | Forrest Gump | 1994.0 | 8,7 | 711386.0 |
17 | The Matrix | 1999.0 | 8,7 | 770559.0 |
18 | The Lord of the Rings: The Two Towers | 2002.0 | 8,7 | 680983.0 |
dropna() metodunu parametresiz olarak kullandığımızda ( veri.dropna() ), sadece eksik veri tespit edilen satırlar silindi. Bir de eksik veri bulunan sütunları silmeye çalışalım.
print(veri.dropna(axis = 1))
Film_Adı | Puan | |
---|---|---|
0 | The Shawshank Redemption | 9,2 |
1 | The Godfather | 9,2 |
2 | The Godfather: Part II | 9 |
3 | Pulp Fiction | 8,9 |
4 | The Dark Knight | 8,9 |
5 | 12 Angry Men | 8,9 |
6 | Schindler's List | 8,9 |
7 | The Lord of the Rings: The Return of the King | 8,8 |
8 | Fight Club | 8,8 |
9 | Star Wars: Episode V - The Empire Strikes Back | 8,8 |
10 | The Lord of the Rings: The Fellowship of the R... | 8,8 |
11 | One Flew Over the Cuckoo's Nest | 8,7 |
12 | Goodfellas | 8,7 |
13 | Seven Samurai | 8,7 |
14 | Inception | 8,7 |
15 | Star Wars | 8,7 |
16 | Forrest Gump | 8,7 |
17 | The Matrix | 8,7 |
18 | The Lord of the Rings: The Two Towers | 8,7 |
thresh Parametresi
dropna() Metodunun, thresh parametresi, veri çerçevesinde en az kaç adet veri varsa satır ya da sütunun silinmemesi gerektiğini belirtir. Bu parametreyi de hem satır hem de sütun için uygulayalım.
print(veri.dropna(thresh=3))
Film_Adı | Yıl | Puan | Oylayan_Kişi | |
---|---|---|---|---|
0 | The Shawshank Redemption | 1994.0 | 9,2 | 1071904.0 |
1 | The Godfather | 1972.0 | 9,2 | 751381.0 |
2 | The Godfather: Part II | 1974.0 | 9 | 488889.0 |
3 | Pulp Fiction | 1994.0 | 8,9 | 830504.0 |
4 | The Dark Knight | 2008.0 | 8,9 | 1045186.0 |
5 | 12 Angry Men | 1957.0 | 8,9 | NaN |
6 | Schindler's List | 1993.0 | 8,9 | 545703.0 |
7 | The Lord of the Rings: The Return of the King | 2003.0 | 8,8 | 758388.0 |
8 | Fight Club | 1999.0 | 8,8 | 814389.0 |
9 | Star Wars: Episode V - The Empire Strikes Back | 1980.0 | 8,8 | 519895.0 |
10 | The Lord of the Rings: The Fellowship of the R... | 2001.0 | 8,8 | 784999.0 |
11 | One Flew Over the Cuckoo's Nest | 1975.0 | 8,7 | 447005.0 |
12 | Goodfellas | 1990.0 | 8,7 | 465445.0 |
13 | Seven Samurai | NaN | 8,7 | 161969.0 |
14 | Inception | 2010.0 | 8,7 | 844938.0 |
15 | Star Wars | 1977.0 | 8,7 | NaN |
16 | Forrest Gump | 1994.0 | 8,7 | 711386.0 |
17 | The Matrix | 1999.0 | 8,7 | 770559.0 |
18 | The Lord of the Rings: The Two Towers | 2002.0 | 8,7 | 680983.0 |
veri.dropna(thresh=3): Bu kod,en az 3 sağlam veri barındıran satırları silme demek oluyor. Aynı işlemi, axis parametresi kullanarak uygulamak istesek kodu şu şekilde yazmamız gerekecekti: veri.dropna(axis=0, thresh=3)
Bir de en az 4 sağlam veri isteyelim bakalım ne sonuç alacağız. Veri çerçevemizde 4 adet sütun bulunduğu için, tümü geçerli, sağlam veri bulunan (dolu) sütunları bulmak istediğimiz anlamına geliyor.
print(veri.dropna(thresh=4))
Film_Adı | Yıl | Puan | Oylayan_Kişi | |
---|---|---|---|---|
0 | The Shawshank Redemption | 1994.0 | 9,2 | 1071904.0 |
1 | The Godfather | 1972.0 | 9,2 | 751381.0 |
2 | The Godfather: Part II | 1974.0 | 9 | 488889.0 |
3 | Pulp Fiction | 1994.0 | 8,9 | 830504.0 |
4 | The Dark Knight | 2008.0 | 8,9 | 1045186.0 |
6 | Schindler's List | 1993.0 | 8,9 | 545703.0 |
7 | The Lord of the Rings: The Return of the King | 2003.0 | 8,8 | 758388.0 |
8 | Fight Club | 1999.0 | 8,8 | 814389.0 |
9 | Star Wars: Episode V - The Empire Strikes Back | 1980.0 | 8,8 | 519895.0 |
10 | The Lord of the Rings: The Fellowship of the R... | 2001.0 | 8,8 | 784999.0 |
11 | One Flew Over the Cuckoo's Nest | 1975.0 | 8,7 | 447005.0 |
12 | Goodfellas | 1990.0 | 8,7 | 465445.0 |
14 | Inception | 2010.0 | 8,7 | 844938.0 |
16 | Forrest Gump | 1994.0 | 8,7 | 711386.0 |
17 | The Matrix | 1999.0 | 8,7 | 770559.0 |
18 | The Lord of the Rings: The Two Towers | 2002.0 | 8,7 | 680983.0 |
Tahmin ettiğiniz gibi, her satırda 4 bilgi bulunan satırlar kaldı, geri kalan satırlar silindi.
Bu metodu bir de sütunlarda uygulayalım. Veri çerçevemizde 19 satır veri bulunmaktadır. En az 18 adet veri bulunan (yani sütünlarda en fazla 1 adet eksik veriye izin verdiğimiz durumdaki) sütunlar kalsın, geri kalanlar silinsin istersek;
print(veri.dropna(axis=1, thresh=18))
Film_Adı | Yıl | Puan | |
---|---|---|---|
0 | The Shawshank Redemption | 1994.0 | 9,2 |
1 | The Godfather | 1972.0 | 9,2 |
2 | The Godfather: Part II | 1974.0 | 9 |
3 | Pulp Fiction | 1994.0 | 8,9 |
4 | The Dark Knight | 2008.0 | 8,9 |
5 | 12 Angry Men | 1957.0 | 8,9 |
6 | Schindler's List | 1993.0 | 8,9 |
7 | The Lord of the Rings: The Return of the King | 2003.0 | 8,8 |
8 | Fight Club | 1999.0 | 8,8 |
9 | Star Wars: Episode V - The Empire Strikes Back | 1980.0 | 8,8 |
10 | The Lord of the Rings: The Fellowship of the R... | 2001.0 | 8,8 |
11 | One Flew Over the Cuckoo's Nest | 1975.0 | 8,7 |
12 | Goodfellas | 1990.0 | 8,7 |
13 | Seven Samurai | NaN | 8,7 |
14 | Inception | 2010.0 | 8,7 |
15 | Star Wars | 1977.0 | 8,7 |
16 | Forrest Gump | 1994.0 | 8,7 |
17 | The Matrix | 1999.0 | 8,7 |
18 | The Lord of the Rings: The Two Towers | 2002.0 | 8,7 |
Oylayan_Kişi sütununda 2 adet eksik veri bulunduğu için o sütun silindi.
fillna() Fonksiyonu
Veri Çerçevelerimizde eksik veri bulunması durumunda, her zaman satır ve sütunları silmeye çalışmayız. Bazen eksik verilerin yerine, yeni değer atamamız gerekebilir. Örneğin matematiksel işlemlerde, Pandas ile satır ya da sütunların ortalama değerlerini hesaplatıp, eksik verilerin yerine ( eksik veriyi, Excel programındaki boş hüçreler gibi düşünülebilir) yazdırabiliriz/atayabiliriz.
value Parametresi
value parametresi, Eksik verilerin yerine istersek yazdırmak istediğimiz değerin belirtildiği kısımdır. value parametresine sayısal değer yazacağımız zaman doğrudan değerin kendisini, metinsel (string) ifadeler de yazacağımız zaman ise tırnak işareti " kullanmamız gerektiğini unutmamalıyız. Şimdiki örnekte, Veri çerçevemizdeki eksik verilerin yerine Mustafa Halil ismini yazdıracağım.
print(veri.fillna(value="Mustafa Halil"))
Film_Adı | Yıl | Puan | Oylayan_Kişi | |
---|---|---|---|---|
0 | The Shawshank Redemption | 1994.0 | 9,2 | 1071904.0 |
1 | The Godfather | 1972.0 | 9,2 | 751381.0 |
2 | The Godfather: Part II | 1974.0 | 9 | 488889.0 |
3 | Pulp Fiction | 1994.0 | 8,9 | 830504.0 |
4 | The Dark Knight | 2008.0 | 8,9 | 1045186.0 |
5 | 12 Angry Men | 1957.0 | 8,9 | Mustafa Halil |
6 | Schindler's List | 1993.0 | 8,9 | 545703.0 |
7 | The Lord of the Rings: The Return of the King | 2003.0 | 8,8 | 758388.0 |
8 | Fight Club | 1999.0 | 8,8 | 814389.0 |
9 | Star Wars: Episode V - The Empire Strikes Back | 1980.0 | 8,8 | 519895.0 |
10 | The Lord of the Rings: The Fellowship of the R... | 2001.0 | 8,8 | 784999.0 |
11 | One Flew Over the Cuckoo's Nest | 1975.0 | 8,7 | 447005.0 |
12 | Goodfellas | 1990.0 | 8,7 | 465445.0 |
13 | Seven Samurai | Mustafa Halil | 8,7 | 161969.0 |
14 | Inception | 2010.0 | 8,7 | 844938.0 |
15 | Star Wars | 1977.0 | 8,7 | Mustafa Halil |
16 | Forrest Gump | 1994.0 | 8,7 | 711386.0 |
17 | The Matrix | 1999.0 | 8,7 | 770559.0 |
18 | The Lord of the Rings: The Two Towers | 2002.0 | 8,7 | 680983.0 |
Boş hücrelere yani eksik verilerin yerine, Yıl sütununun ortalama değerini (1885.0) atamak isteseydik (saçma bir atama işlemi olduğunun farkındayım :) ), aşağıdaki gibi kodlarımızı düzenlememiz gerekecekti.
ortalama = int(veri["Yıl"].sum()/19)
print(veri.fillna(value=ortalama))
Film_Adı | Yıl | Puan | Oylayan_Kişi | |
---|---|---|---|---|
0 | The Shawshank Redemption | 1994.0 | 9,2 | 1071904.0 |
1 | The Godfather | 1972.0 | 9,2 | 751381.0 |
2 | The Godfather: Part II | 1974.0 | 9 | 488889.0 |
3 | Pulp Fiction | 1994.0 | 8,9 | 830504.0 |
4 | The Dark Knight | 2008.0 | 8,9 | 1045186.0 |
5 | 12 Angry Men | 1957.0 | 8,9 | 1885.0 |
6 | Schindler's List | 1993.0 | 8,9 | 545703.0 |
7 | The Lord of the Rings: The Return of the King | 2003.0 | 8,8 | 758388.0 |
8 | Fight Club | 1999.0 | 8,8 | 814389.0 |
9 | Star Wars: Episode V - The Empire Strikes Back | 1980.0 | 8,8 | 519895.0 |
10 | The Lord of the Rings: The Fellowship of the R... | 2001.0 | 8,8 | 784999.0 |
11 | One Flew Over the Cuckoo's Nest | 1975.0 | 8,7 | 447005.0 |
12 | Goodfellas | 1990.0 | 8,7 | 465445.0 |
13 | Seven Samurai | 1885.0 | 8,7 | 161969.0 |
14 | Inception | 2010.0 | 8,7 | 844938.0 |
15 | Star Wars | 1977.0 | 8,7 | 1885.0 |
16 | Forrest Gump | 1994.0 | 8,7 | 711386.0 |
17 | The Matrix | 1999.0 | 8,7 | 770559.0 |
18 | The Lord of the Rings: The Two Towers | 2002.0 | 8,7 | 680983.0 |
method Parametresi
Veri çerçevesinde değer girilmemiş hücreleri (boşlukları) doldurmak, başka bir ifadeyle, değer atamak için method
parametresi kullanılabilir.
method
parametresinin alabileceği değerler;
- backfill
- bfill
- pad
- ffill
- None Varsayılan (öntanımlı) değer None'dır.
Öncelikle Veri çerçevesi oluşturup inceleyelim;
sozluk = {"isim" : ["Mustafa", "Halil", "Burak", "Emre", "Ersin", "Sertaç", "Furkan","Murat","Ahmet","Abdülkadir"],
"yaş" : [25, 38, 41, 23, 37, 52, 30, 23, 40, 38],
"iş-meslek" : ["mühendis", "programcı", "akademisyen", "yönetici","amir","mühendis", "yönetici","müdür","veteriner","yönetici"],
"kategori" : ["Kategori_1", None, "Kategori_3", "Kategori_4", "Kategori_5", None, None, "Kategori_8", "Kategori_9", None]}
veri = pd.DataFrame(sozluk)
veri
isim | yaş | iş-meslek | kategori | |
---|---|---|---|---|
0 | Mustafa | 25 | mühendis | Kategori_1 |
1 | Halil | 38 | programcı | None |
2 | Burak | 41 | akademisyen | Kategori_3 |
3 | Emre | 23 | yönetici | Kategori_4 |
4 | Ersin | 37 | amir | Kategori_5 |
5 | Sertaç | 52 | mühendis | None |
6 | Furkan | 30 | yönetici | None |
7 | Murat | 23 | müdür | Kategori_8 |
8 | Ahmet | 40 | veteriner | Kategori_9 |
9 | Abdülkadir | 38 | yönetici | None |
Veri çerçevesini incelediğimzde, Halil, Sertaç, Furkan ve Ahmet'in kategori bilgilerinin, geçerli değere sahip olmadığını görüyoruz. Bu değerleri method
parametresinin seçeneklerini kullanarak doldurmaya çalışalım.
Öncelikle backfill ve bfill seçeneklerini inceleyelim.
veri = veri.fillna(method="backfill")
print(veri)
isim | yaş | iş-meslek | kategori | |
---|---|---|---|---|
0 | Mustafa | 25 | mühendis | Kategori_1 |
1 | Halil | 38 | programcı | Kategori_3 |
2 | Burak | 41 | akademisyen | Kategori_3 |
3 | Emre | 23 | yönetici | Kategori_4 |
4 | Ersin | 37 | amir | Kategori_5 |
5 | Sertaç | 52 | mühendis | Kategori_8 |
6 | Furkan | 30 | yönetici | Kategori_8 |
7 | Murat | 23 | müdür | Kategori_8 |
8 | Ahmet | 40 | veteriner | Kategori_9 |
9 | Abdülkadir | 38 | yönetici | None |
veri = veri.fillna(method="bfill")
print(veri)
isim | yaş | iş-meslek | kategori | |
---|---|---|---|---|
0 | Mustafa | 25 | mühendis | Kategori_1 |
1 | Halil | 38 | programcı | Kategori_3 |
2 | Burak | 41 | akademisyen | Kategori_3 |
3 | Emre | 23 | yönetici | Kategori_4 |
4 | Ersin | 37 | amir | Kategori_5 |
5 | Sertaç | 52 | mühendis | Kategori_8 |
6 | Furkan | 30 | yönetici | Kategori_8 |
7 | Murat | 23 | müdür | Kategori_8 |
8 | Ahmet | 40 | veteriner | Kategori_9 |
9 | Abdülkadir | 38 | yönetici | None |
Görüldüğü üzere, backfill ve bfill seçenekleri sayesinde boş (geçersiz değere sahip) hücreler, kendinden sonraki (altında bulunan) son geçerli hücrenin değeri ile dolduruldu.
Şimdi sıra pad ve ffill seçeneklerinde;
veri = veri.fillna(method="pad")
print(veri)
isim | yaş | iş-meslek | kategori | |
---|---|---|---|---|
0 | Mustafa | 25 | mühendis | Kategori_1 |
1 | Halil | 38 | programcı | Kategori_1 |
2 | Burak | 41 | akademisyen | Kategori_3 |
3 | Emre | 23 | yönetici | Kategori_4 |
4 | Ersin | 37 | amir | Kategori_5 |
5 | Sertaç | 52 | mühendis | Kategori_5 |
6 | Furkan | 30 | yönetici | Kategori_5 |
7 | Murat | 23 | müdür | Kategori_8 |
8 | Ahmet | 40 | veteriner | Kategori_9 |
9 | Abdülkadir | 38 | yönetici | Kategori_9 |
veri = veri.fillna(method="ffill")
print(veri)
isim | yaş | iş-meslek | kategori | |
---|---|---|---|---|
0 | Mustafa | 25 | mühendis | Kategori_1 |
1 | Halil | 38 | programcı | Kategori_1 |
2 | Burak | 41 | akademisyen | Kategori_3 |
3 | Emre | 23 | yönetici | Kategori_4 |
4 | Ersin | 37 | amir | Kategori_5 |
5 | Sertaç | 52 | mühendis | Kategori_5 |
6 | Furkan | 30 | yönetici | Kategori_5 |
7 | Murat | 23 | müdür | Kategori_8 |
8 | Ahmet | 40 | veteriner | Kategori_9 |
9 | Abdülkadir | 38 | yönetici | Kategori_9 |
backfill ve bfill seçeneklerinin tersine pad ve ffill seçenekleri ile sayesinde ise boş (geçersiz değere sahip) hücreler, kendinden önceki (üstünde bulunan) son geçerli hücrenin değeri ile dolduruldu.
UYARI:
Method
parametresi, Pandas'ın 2.1.0 sürümünden beri kullanımdan kaldırılmıştır: Bunun yerine ffill()
veya bfill()
fonksiyonlarını kullanabiliriz.
Eksik Verileri Doldur
Veri Çerçevelerinizdeki BOŞ (NA/NaN) hücreleri (tüm boş hücreleri ya da istenilen sütunlardaki boş hücreleri), ÖNCEKİ ya da SONRAKİ GEÇERLİ DEĞERLE otomatik olarak dolduralım.
Bunu, Pandas Kütüphanesinin ffill()
ve bfill()
fonksiyonları yardımı ile kolayca gerçekleştirebilriz. aşağıdaki örnek kodları ve çıktılarını inceleyelim.
ffill() Fonksiyonu
Veri Çerçevesindeki BOŞ (NA/NaN) hücreleri (tüm boş hücreleri ya da istenilen sütunlardaki boş hücreleri), ÖNCEKİ GEÇERLİ DEĞERLE otomatik olarak doldurmak için ffill()
fonksiyonunu kullanabiliriz. Kodun yazımı ve parametreleri aşağıdaki gibidir.
DataFrame.ffill(*, axis=None, inplace=False, limit=None, limit_area=None, downcast=_NoDefault.no_default)
PARAMETRELER:
axis: Eksik değerlerin doldurulacağı ekseni tanımlar. Seriler için {0
veya index
}, DataFrame için {index / satır
için 0
, veya columns / sütun
için 1
değerleri kullanılabilir.}
Not: Seriler için bu parametre kullanılmaz ve varsayılan değer 0'dır.
inplace: bool, varsayılan False
Gerçekleştirilen işleminin veri çerçevesinde kalıcı ya da geçici olmasını ayarladığımız parametredir. inplace = True
yazılırsa, yapılan işlem kalıcı hale gelecektir. Varsayılan değer False
olarak belirtilmiştir.
limit: int, varsayılan None
Parametre belirtilirse, bu, ileri/geri doldurulacak ardışık NaN
değerlerinin maksimum sayısını temsil eder. Başka bir deyişle, bu sayıdan daha fazla ardışık
NaN
içeren bir boşluk varsa, yalnızca kısmen doldurulacaktır. Parametre belirtilmemişse yani boş bırakılmışsa, bu, NaN
'ların doldurulacağı tüm eksen boyunca maksimum sayısını temsil eder. Yok değilse 0'dan büyük olmalıdır
limit_area{None, ‘inside’, ‘outside’}, varsayılan None
Limit belirtilirse, ardışık NaN
'lar bu kısıtlama ile doldurulur.
None (Yok / Boş)
: Dolgu kısıtlaması yok.
inside (içinde)
: Yalnızca geçerli değerlerle çevrili NaN
'ları doldurun.
outside (dışında)
: Yalnızca geçerli değerlerin dışındaki NaN
'ları doldurun.
Örneklere göz atalım.
Birkaç İl'e ait suç verilerinin bulunduğu Veri çerçevemiz aşağıdaki gibidir.
import pandas as pd
df = pd.read_excel("Suc Verileri.xlsx")
print(df)
ÇIKTI:
Şehir | Cinsiyet | Hakaret | Hırsızlık | Dolandırıcılık | |
---|---|---|---|---|---|
0 | İstanbul | Erkek - Male | 520.0 | 6306.0 | 1846.0 |
1 | NaN | Kadın - Female | 32.0 | 487.0 | 108.0 |
2 | NaN | NaN | NaN | NaN | NaN |
3 | NaN | NaN | NaN | NaN | NaN |
4 | NaN | NaN | NaN | NaN | NaN |
5 | İzmir | Erkek - Male | 353.0 | 2804.0 | 763.0 |
6 | NaN | Kadın - Female | 21.0 | 185.0 | 45.0 |
7 | NaN | NaN | NaN | NaN | NaN |
8 | NaN | NaN | NaN | NaN | NaN |
9 | NaN | NaN | NaN | NaN | NaN |
10 | NaN | NaN | NaN | NaN | NaN |
11 | Bursa | Erkek - Male | 151.0 | 1498.0 | 313.0 |
12 | NaN | Kadın - Female | 10.0 | 121.0 | 21.0 |
13 | NaN | NaN | NaN | NaN | NaN |
14 | NaN | NaN | NaN | NaN | NaN |
15 | NaN | NaN | NaN | NaN | NaN |
16 | NaN | NaN | NaN | NaN | NaN |
17 | Ankara | Erkek - Male | 260.0 | 2169.0 | 636.0 |
18 | NaN | Kadın - Female | 19.0 | 147.0 | 52.0 |
19 | NaN | NaN | NaN | NaN | NaN |
20 | NaN | NaN | NaN | NaN | NaN |
21 | NaN | NaN | NaN | NaN | NaN |
22 | Toplam | NaN | 1366.0 | 13717.0 | 3784.0 |
Aşağıdaki kod, Veri çerçevesinin her sütunundaki boş/kayıp veriyi (hücreyi), üstteki (önceki) geçerli veri ile doldurulur.
df.ffill(axis=None, inplace = True, limit=None, limit_area=None)
print(df)
ÇIKTI:
Şehir | Cinsiyet | Hakaret | Hırsızlık | Dolandırıcılık | |
---|---|---|---|---|---|
0 | İstanbul | Erkek - Male | 520.0 | 6306.0 | 1846.0 |
1 | İstanbul | Kadın - Female | 32.0 | 487.0 | 108.0 |
2 | İstanbul | Kadın - Female | 32.0 | 487.0 | 108.0 |
3 | İstanbul | Kadın - Female | 32.0 | 487.0 | 108.0 |
4 | İstanbul | Kadın - Female | 32.0 | 487.0 | 108.0 |
5 | İzmir | Erkek - Male | 353.0 | 2804.0 | 763.0 |
6 | İzmir | Kadın - Female | 21.0 | 185.0 | 45.0 |
7 | İzmir | Kadın - Female | 21.0 | 185.0 | 45.0 |
8 | İzmir | Kadın - Female | 21.0 | 185.0 | 45.0 |
9 | İzmir | Kadın - Female | 21.0 | 185.0 | 45.0 |
10 | İzmir | Kadın - Female | 21.0 | 185.0 | 45.0 |
11 | Bursa | Erkek - Male | 151.0 | 1498.0 | 313.0 |
12 | Bursa | Kadın - Female | 10.0 | 121.0 | 21.0 |
13 | Bursa | Kadın - Female | 10.0 | 121.0 | 21.0 |
14 | Bursa | Kadın - Female | 10.0 | 121.0 | 21.0 |
15 | Bursa | Kadın - Female | 10.0 | 121.0 | 21.0 |
16 | Bursa | Kadın - Female | 10.0 | 121.0 | 21.0 |
17 | Ankara | Erkek - Male | 260.0 | 2169.0 | 636.0 |
18 | Ankara | Kadın - Female | 19.0 | 147.0 | 52.0 |
19 | Ankara | Kadın - Female | 19.0 | 147.0 | 52.0 |
20 | Ankara | Kadın - Female | 19.0 | 147.0 | 52.0 |
21 | Ankara | Kadın - Female | 19.0 | 147.0 | 52.0 |
22 | Toplam | Kadın - Female | 1366.0 | 13717.0 | 3784.0 |
Aşağıdaki kod, arda arda en fazla 2 adet boş/kayıp veriyi (hücreyi) üstte (önceki) geçerli veri ile doldurur.
df.ffill(axis=0, inplace = True, limit=2, limit_area="inside")
df
ÇIKTI:
Şehir | Cinsiyet | Hakaret | Hırsızlık | Dolandırıcılık | |
---|---|---|---|---|---|
0 | İstanbul | Erkek - Male | 520.0 | 6306.0 | 1846.0 |
1 | İstanbul | Kadın - Female | 32.0 | 487.0 | 108.0 |
2 | İstanbul | Kadın - Female | 32.0 | 487.0 | 108.0 |
3 | NaN | Kadın - Female | 32.0 | 487.0 | 108.0 |
4 | NaN | NaN | NaN | NaN | NaN |
5 | İzmir | Erkek - Male | 353.0 | 2804.0 | 763.0 |
6 | İzmir | Kadın - Female | 21.0 | 185.0 | 45.0 |
7 | İzmir | Kadın - Female | 21.0 | 185.0 | 45.0 |
8 | NaN | Kadın - Female | 21.0 | 185.0 | 45.0 |
9 | NaN | NaN | NaN | NaN | NaN |
10 | NaN | NaN | NaN | NaN | NaN |
11 | Bursa | Erkek - Male | 151.0 | 1498.0 | 313.0 |
12 | Bursa | Kadın - Female | 10.0 | 121.0 | 21.0 |
13 | Bursa | Kadın - Female | 10.0 | 121.0 | 21.0 |
14 | NaN | Kadın - Female | 10.0 | 121.0 | 21.0 |
15 | NaN | NaN | NaN | NaN | NaN |
16 | NaN | NaN | NaN | NaN | NaN |
17 | Ankara | Erkek - Male | 260.0 | 2169.0 | 636.0 |
18 | Ankara | Kadın - Female | 19.0 | 147.0 | 52.0 |
19 | Ankara | NaN | 19.0 | 147.0 | 52.0 |
20 | NaN | NaN | 19.0 | 147.0 | 52.0 |
21 | NaN | NaN | NaN | NaN | NaN |
22 | Toplam | NaN | 1366.0 | 13717.0 | 3784.0 |
bfill() Fonksiyonu
Veri Çerçevesindeki BOŞ (NA/NaN) hücreleri (tüm boş hücreleri ya da istenilen sütunlardaki boş hücreleri), SONRAKİ GEÇERLİ DEĞERLE otomatik olarak doldurmak için bfill()
fonksiyonunu kullanabiliriz. Kodun yazımı ve parametreleri aşağıdaki gibidir.
DataFrame.bfill(*, axis=None, inplace=False, limit=None, limit_area=None, downcast=_NoDefault.no_default)
PARAMETRELER:
axis: Eksik değerlerin doldurulacağı ekseni tanımlar. Seriler için {0
veya index
}, DataFrame için {index / satır
için 0
, veya columns / sütun
için 1
değerleri kullanılabilir.}
Not: Seriler için bu parametre kullanılmaz ve varsayılan değer 0'dır.
inplace: bool, varsayılan False
Gerçekleştirilen işleminin veri çerçevesinde kalıcı ya da geçici olmasını ayarladığımız parametredir. inplace = True
yazılırsa, yapılan işlem kalıcı hale gelecektir. Varsayılan değer False
olarak belirtilmiştir.
limit: int, varsayılan None
Parametre belirtilirse, bu, ileri/geri doldurulacak ardışık NaN
değerlerinin maksimum sayısını temsil eder. Başka bir deyişle, bu sayıdan daha fazla ardışık
NaN
içeren bir boşluk varsa, yalnızca kısmen doldurulacaktır. Parametre belirtilmemişse yani boş bırakılmışsa, bu, NaN
'ların doldurulacağı tüm eksen boyunca maksimum sayısını temsil eder. Yok değilse 0'dan büyük olmalıdır
limit_area{None, ‘inside’, ‘outside’}, varsayılan None
Limit belirtilirse, ardışık NaN
'lar bu kısıtlama ile doldurulur.
None (Yok / Boş)
: Dolgu kısıtlaması yok.
inside (içinde)
: Yalnızca geçerli değerlerle çevrili NaN
'ları doldurun.
outside (dışında)
: Yalnızca geçerli değerlerin dışındaki NaN
'ları doldurun.
Örneklere göz atalım.
Birkaç İl'e ait suç verilerinin bulunduğu Veri çerçevemiz aşağıdaki gibidir.
import pandas as pd
df = pd.read_excel("Suc Verileri.xlsx")
print(df)
Şehir | Cinsiyet | Hakaret | Hırsızlık | Dolandırıcılık | |
---|---|---|---|---|---|
0 | İstanbul | Erkek - Male | 520.0 | 6306.0 | 1846.0 |
1 | NaN | Kadın - Female | 32.0 | 487.0 | 108.0 |
2 | NaN | NaN | NaN | NaN | NaN |
3 | NaN | NaN | NaN | NaN | NaN |
4 | NaN | NaN | NaN | NaN | NaN |
5 | İzmir | Erkek - Male | 353.0 | 2804.0 | 763.0 |
6 | NaN | Kadın - Female | 21.0 | 185.0 | 45.0 |
7 | NaN | NaN | NaN | NaN | NaN |
8 | NaN | NaN | NaN | NaN | NaN |
9 | NaN | NaN | NaN | NaN | NaN |
10 | NaN | NaN | NaN | NaN | NaN |
11 | Bursa | Erkek - Male | 151.0 | 1498.0 | 313.0 |
12 | NaN | Kadın - Female | 10.0 | 121.0 | 21.0 |
13 | NaN | NaN | NaN | NaN | NaN |
14 | NaN | NaN | NaN | NaN | NaN |
15 | NaN | NaN | NaN | NaN | NaN |
16 | NaN | NaN | NaN | NaN | NaN |
17 | Ankara | Erkek - Male | 260.0 | 2169.0 | 636.0 |
18 | NaN | Kadın - Female | 19.0 | 147.0 | 52.0 |
19 | NaN | NaN | NaN | NaN | NaN |
20 | NaN | NaN | NaN | NaN | NaN |
21 | NaN | NaN | NaN | NaN | NaN |
22 | Toplam | NaN | 1366.0 | 13717.0 | 3784.0 |
Aşağıdaki kod, arda arda en fazla 2 adet boş/kayıp veriyi (hücreyi) altta (sonraki) geçerli veri ile doldurur.
df.bfill(axis=0, inplace = True, limit=2, limit_area="inside")
df
ÇIKTI:
Şehir | Cinsiyet | Hakaret | Hırsızlık | Dolandırıcılık | |
---|---|---|---|---|---|
0 | İstanbul | Erkek - Male | 520.0 | 6306.0 | 1846.0 |
1 | NaN | Kadın - Female | 32.0 | 487.0 | 108.0 |
2 | NaN | NaN | NaN | NaN | NaN |
3 | İzmir | Erkek - Male | 353.0 | 2804.0 | 763.0 |
4 | İzmir | Erkek - Male | 353.0 | 2804.0 | 763.0 |
5 | İzmir | Erkek - Male | 353.0 | 2804.0 | 763.0 |
6 | NaN | Kadın - Female | 21.0 | 185.0 | 45.0 |
7 | NaN | NaN | NaN | NaN | NaN |
8 | NaN | NaN | NaN | NaN | NaN |
9 | Bursa | Erkek - Male | 151.0 | 1498.0 | 313.0 |
10 | Bursa | Erkek - Male | 151.0 | 1498.0 | 313.0 |
11 | Bursa | Erkek - Male | 151.0 | 1498.0 | 313.0 |
12 | NaN | Kadın - Female | 10.0 | 121.0 | 21.0 |
13 | NaN | NaN | NaN | NaN | NaN |
14 | NaN | NaN | NaN | NaN | NaN |
15 | Ankara | Erkek - Male | 260.0 | 2169.0 | 636.0 |
16 | Ankara | Erkek - Male | 260.0 | 2169.0 | 636.0 |
17 | Ankara | Erkek - Male | 260.0 | 2169.0 | 636.0 |
18 | NaN | Kadın - Female | 19.0 | 147.0 | 52.0 |
19 | NaN | NaN | NaN | NaN | NaN |
20 | Toplam | NaN | 1366.0 | 13717.0 | 3784.0 |
21 | Toplam | NaN | 1366.0 | 13717.0 | 3784.0 |
22 | Toplam | NaN | 1366.0 | 13717.0 | 3784.0 |
Aşağıdaki kod, Veri çerçevesinin her sütunundaki boş/kayıp veriyi (hücreyi), alttaki (sonraki) geçerli veri ile doldurulur.
df.bfill(axis=None, inplace = True, limit=None, limit_area=None)
df
ÇIKTI:
Şehir | Cinsiyet | Hakaret | Hırsızlık | Dolandırıcılık | |
---|---|---|---|---|---|
0 | İstanbul | Erkek - Male | 520.0 | 6306.0 | 1846.0 |
1 | İzmir | Kadın - Female | 32.0 | 487.0 | 108.0 |
2 | İzmir | Erkek - Male | 353.0 | 2804.0 | 763.0 |
3 | İzmir | Erkek - Male | 353.0 | 2804.0 | 763.0 |
4 | İzmir | Erkek - Male | 353.0 | 2804.0 | 763.0 |
5 | İzmir | Erkek - Male | 353.0 | 2804.0 | 763.0 |
6 | Bursa | Kadın - Female | 21.0 | 185.0 | 45.0 |
7 | Bursa | Erkek - Male | 151.0 | 1498.0 | 313.0 |
8 | Bursa | Erkek - Male | 151.0 | 1498.0 | 313.0 |
9 | Bursa | Erkek - Male | 151.0 | 1498.0 | 313.0 |
10 | Bursa | Erkek - Male | 151.0 | 1498.0 | 313.0 |
11 | Bursa | Erkek - Male | 151.0 | 1498.0 | 313.0 |
12 | Ankara | Kadın - Female | 10.0 | 121.0 | 21.0 |
13 | Ankara | Erkek - Male | 260.0 | 2169.0 | 636.0 |
14 | Ankara | Erkek - Male | 260.0 | 2169.0 | 636.0 |
15 | Ankara | Erkek - Male | 260.0 | 2169.0 | 636.0 |
16 | Ankara | Erkek - Male | 260.0 | 2169.0 | 636.0 |
17 | Ankara | Erkek - Male | 260.0 | 2169.0 | 636.0 |
18 | Toplam | Kadın - Female | 19.0 | 147.0 | 52.0 |
19 | Toplam | NaN | 1366.0 | 13717.0 | 3784.0 |
20 | Toplam | NaN | 1366.0 | 13717.0 | 3784.0 |
21 | Toplam | NaN | 1366.0 | 13717.0 | 3784.0 |
22 | Toplam | NaN | 1366.0 | 13717.0 | 3784.0 |