Pandas 02 - Excel Dosyaları ile Çalışmak

Excel Dosyalarını Oku ve Düzenle Yöntemleri

Bu bölümde MS Excel ve Libre Ofis Calc programları ile oluşturulan hesap tablolarının Veri Çerçevelerine (Data Frame'e) dönüştürülerek çalışmalarımıza dahil edilmesi konusunu detayı olarak inceleyeceğiz.

read_excel() fonksiyonu

MS Excel ve Libre Ofis Calc dosyalarının içeriğini çalışmamıza dahil etmek için read_excel() fonksiyonunu kullanmalıyız.

Bu fonksiyon;

import pandas as pd
pd.read_excel(dosya_adi)

Bu fonksiyon kullanıldığında, varsayılan olarak, excel dosyasının ilk çalışma sayfası yüklenir ve ilk satır Veri Çerçevesi (DataFrame) başlığı (sütun adı) olarak ayarlanır.

header ve names Parametreleri

read_excel () fonksiyonu, Excel'deki ilk satırı varsayılan olarak bir başlık kabul eder ve bunu Veri Çerçevesi (DataFrame) sütun adları olarak kullanır. Excel dosyasındaki ilk satırın başlık değil, bir veri olduğu düşünüldüğünde, yani sadece verilerden oluşan excel dosyası ile çalıştığımızda, header=None parametresi kullanılmalıdır. Bu durumda Başlık (sütun adlarını) belirtmek için names parametresi kullanılır.

İlk olarak OSD uzantılı bir dosyayı (ODS, LibreOfis Calc Programının uzantısıdır , siz bu dosya yerine MS Excel'in kayıt formatı olan XLS ya da XLSX uzantılı dosya da kullanabilirsiniz.) çalışmamıza dahil edip içeriğine bakalım.

import pandas as pd
basliksiz = pd.read_excel("Veri_Setleri/basliksiz.ods")
print(basliksiz.head())
9 82 246
0 7 78 180
1 8 83 565
2 6 82 486
3 4 37 615
4 2 18 341

Gördüğünüz gibi ilk satır başlık değil, veriden oluşuyor. Bunu header=None ve names parametreleri ile düzenleyelim.

baslik = ["Birler", "Onlar", "Yüzler"]
basliksiz = pd.read_excel("Veri_Setleri/basliksiz.ods", header = None, names = baslik )
print(basliksiz.head())
Birler Onlar Yüzler
0 9 82 246
1 7 78 180
2 8 83 565
3 6 82 486
4 4 37 615

sheet_name Parametresi

Excel dosyamızın içinde birden fazla çalışma sayfası (sekme) bulunması halinde, istediğimiz çalışma sayfasına erişebilmek için, sheet_name parametresini kullanmalıyız.

Aylara göre doğum sayılarını barındıran dosyamızı çalışmamıza dahil edip ilk 5 veriye göz atalım.

dogumlar = pd.read_excel("Veri_Setleri/AyaGöreDoğumlar.xlsx")
print(dogumlar.head())
Yıl Toplam Ocak Şubat Mart Nisan Mayıs Haziran Temmuz Ağustos Eylül Ekim Kasım Aralık
0 2001 1323341 170397 103476 107912 102585 110391 111722 119752 120963 109590 103662 92554 70337
1 2002 1229555 155065 103446 102175 95976 99501 102627 109747 108061 99701 96216 89285 67755
2 2003 1198927 138670 89548 101046 92574 99531 104644 109225 109159 98766 94838 89542 71384
3 2004 1222484 141538 94596 100696 100801 102214 105728 111102 110425 98492 94840 90833 71219
4 2005 1244041 142311 94234 100529 97441 106833 108536 111066 111430 103273 103310 92364 72714

Kodumuza sheet_name = "ortalama" ibaresi ekleyerek, aynı dosyadaki "ortalama" isimli sekmede bulunan verileri inceleyelim.

dogumlar = pd.read_excel("Veri_Setleri/AyaGöreDoğumlar.xlsx", sheet_name = "ortalama")
print(dogumlar.head())
Yıl Toplam Ortalama
0 2001 1323341 110278.416667
1 2002 1229555 102462.916667
2 2003 1198927 99910.583333
3 2004 1222484 101873.666667
4 2005 1244041 103670.083333

Gördüğünüz gibi, kodumuza sheet_name = "ortalama" ibaresi ekleyerek, aynı excel dosyasının ortalama isimli çalışma sayfasındaki verileri, çalışmamıza veri çerçevesi olarak ekledik.

Birden fazla çalışma sayfasını, çalışmamıza dahil etmek (içe aktarmak) istersek, sheet_name parametresine bir liste girdisi vermeliyiz. Bu durumda çıktı, bir sözlük yapısı (dict) olacaktır.

dogumlar = pd.read_excel("Veri_Setleri/AyaGöreDoğumlar.xlsx", sheet_name = ["ortalama", "2001-2021"])
print(dogumlar)
{'ortalama':      Yıl   Toplam       Ortalama
 0   2001  1323341  110278.416667
 1   2002  1229555  102462.916667
 2   2003  1198927   99910.583333
 3   2004  1222484  101873.666667
 4   2005  1244041  103670.083333
 5   2006  1255432  104619.333333
 6   2007  1289992  107499.333333
 7   2008  1295511  107959.250000
 8   2009  1266751  105562.583333
 9   2010  1261169  105097.416667
 10  2011  1252812  104401.000000
 11  2012  1294605  107883.750000
 12  2013  1297505  108125.416667
 13  2014  1351088  112590.666667
 14  2015  1336908  111409.000000
 15  2016  1316204  109683.666667
 16  2017  1299419  108284.916667
 17  2018  1255258  104604.833333
 18  2019  1188524   99043.666667
 19  2020  1115821   92985.083333
 20  2021  1079842   89986.833333,
 '2001-2021':      Yıl   Toplam    Ocak   Şubat    Mart   Nisan   Mayıs  Haziran  Temmuz  \
 0   2001  1323341  170397  103476  107912  102585  110391   111722  119752   
 1   2002  1229555  155065  103446  102175   95976   99501   102627  109747   
 2   2003  1198927  138670   89548  101046   92574   99531   104644  109225   
 3   2004  1222484  141538   94596  100696  100801  102214   105728  111102   
 4   2005  1244041  142311   94234  100529   97441  106833   108536  111066   
 5   2006  1255432  128708   94760  104126   97624  103903   112016  115097   
 6   2007  1289992  131276   93927  102807  100159  108119   110359  122324   
 7   2008  1295511  130424   98099  102962  102877  107003   110089  119977   
 8   2009  1266751  122407   92414   99419  103432  103783   107847  117160   
 9   2010  1261169  119444   95023  103583   99477  103676   109441  113639   
 10  2011  1252812  118547   92484  100992   95348   94131   104086  114390   
 11  2012  1294605  119556   99966  105499   98880  105807   110056  118649   
 12  2013  1297505  118373   94803  102471   96865  106757   109672  123758   
 13  2014  1351088  121694   96802  105603  105652  112448   115978  129616   
 14  2015  1336908  120373   99169  105792  103110  105254   115681  130945   
 15  2016  1316204  114274  100640  105166  101947  104080   117994  120126   
 16  2017  1299419  114968   95567  101700   96132  106274   115827  122894   
 17  2018  1255258  107530   90002  101283   94776  104719   110383  117967   
 18  2019  1188524  104044   85510   96631   93013  105166    97965  112628   
 19  2020  1115821   94888   83433   89503   88526   93159    99232  105970   
 20  2021  1079842   80733   77535   86214   82789   88506    94266   99252   

     Ağustos   Eylül    Ekim   Kasım  Aralık  
 0    120963  109590  103662   92554   70337  
 1    108061   99701   96216   89285   67755  
 2    109159   98766   94838   89542   71384  
 3    110425   98492   94840   90833   71219  
 4    111430  103273  103310   92364   72714  
 5    117298  107158  105773   93167   75802  
 6    118169  111055  109888   99639   82270  
 7    120048  114470  107978   97389   84195  
 8    116229  115824  105407   96155   86674  
 9    113082  110324  104427  101610   87443  
 10   121152  112959  105048  102970   90705  
 11   123634  110338  108327  102413   91480  
 12   121625  112913  110716  104182   95370  
 13   126296  119030  111754  105566  100649  
 14   123296  116428  112839  106319   97702  
 15   124833  114366  107951  104959   99868  
 16   122386  110811  108538  104386   99936  
 17   116715  107105  107818  100436   96524  
 18   109182   99981   98320   92936   93148  
 19   100478   96018   93428   87540   83646  
 20   100407   97334   93290   92189   87327  }

decimal Parametresi

Harici kaynaktan içe aktararak oluşturduğumuz veri çerçevelerini incelediğimizde, sayısal olduğunu düşündüğümüz bazı değerlerin, metinsel (string) olduğunu farkederiz. Bunun sebebi, farklı ülkelerin farklı bölgesel ayarlar kullanmalarından kaynaklanır. Örneğin Ülkemiz ve Avrupa ülkelerinde sayıların ondalık kısımlarını temsil etmek için virgül (,), binlik basamakları ayırmak için nokta (.) karakteri kullanılırken bazı Ülkelerde bunun tersi kullanılmaktadır. Elimde, interneten indirmiş olduğum IMDB (Internet Movie Data Base) verilerinden oluşan bir excel dosyası bulunmaktadır. Bu dosyayı veri çerçevesine dönüştürüp içeriğini inceleyelim.

imdb = pd.read_excel("Veri_Setleri/imdb.xlsx")
print(imdb)
Film_Adı Yıl Puan Oylayan_Kişi
0 The Shawshank Redemption 1994 9,2 1071904
1 The Godfather 1972 9,2 751381
2 The Godfather: Part II 1974 9 488889
3 Pulp Fiction 1994 8,9 830504
4 The Dark Knight 2008 8,9 1045186
... ... ... ... ...
242 Mystic River 2003 7,9 256159
243 In the Heat of the Night 1967 7,9 37081
244 Arsenic and Old Lace 1944 7,9 45893
245 Before Sunrise 1995 7,9 100974
246 Papillon 1973 7,9 62517

247 rows × 4 columns

Gördüğüm kadarı ile Film_Adı sütunu object (yani string) diğer sütunlar ise float (ondalıklı sayı) veri tipinde gibi görünüyor. Sütun biçimlerinin tahmin ettiğim gibi olup olmadığını teyit etmek için dtype paramatresini kullanıyorum.

print(imdb.dtypes)
Film_Adı        object
Yıl              int64
Puan            object
Oylayan_Kişi     int64
dtype: object

Çıktıyı incelediğimde, Puan isimli sütun verilerinin de object (yani string) oluğunu görüyorum. Yani Bu sütundaki verilerle matematiksel işlem yapmaya çalışırsam ya hata mesajı alacak ya da yanlış sonuç elde edeceğim. Bunu da örneklerle inceleyelim. Puan sütununun 2 katını alıp yeni bir sütun olarak veri çerçevesine eklemeyi deneyelim.

imdb["Puan_2"] = imdb["Puan"] * 2
print(imdb)
Film_Adı Yıl Puan Oylayan_Kişi Puan_2
0 The Shawshank Redemption 1994 9,2 1071904 9,29,2
1 The Godfather 1972 9,2 751381 9,29,2
2 The Godfather: Part II 1974 9 488889 18
3 Pulp Fiction 1994 8,9 830504 8,98,9
4 The Dark Knight 2008 8,9 1045186 8,98,9
... ... ... ... ... ...
242 Mystic River 2003 7,9 256159 7,97,9
243 In the Heat of the Night 1967 7,9 37081 7,97,9
244 Arsenic and Old Lace 1944 7,9 45893 7,97,9
245 Before Sunrise 1995 7,9 100974 7,97,9
246 Papillon 1973 7,9 62517 7,97,9

247 rows × 5 columns

Çıktıya bakarsak, Puan_2 ismiyle oluşturduğumuz yeni sütundaki değerler, Puan isimli sütunun 2 katından değil, 2 defa yanyana yazılmazsından oluştu. Bunun sebebi, verilerin string (metin) yapıda olmasıdır. Bu tür sorunları bertaraf etmek için, decimal paramatresini kullanmamız gerekir. Harici veriyi veri çerçevesine dönüştürürken decimal = "," parametresini kullanırsak, "," ibaresi bulunan sayısal değerlerden oluşan string ifadeler, float (ondalıklı sayı) veri tipine dönüştürülür.

imdb_2 = pd.read_excel("Veri_Setleri/imdb.xlsx", decimal=",")
print(imdb_2)
Film_Adı Yıl Puan Oylayan_Kişi
0 The Shawshank Redemption 1994 9.2 1071904
1 The Godfather 1972 9.2 751381
2 The Godfather: Part II 1974 9.0 488889
3 Pulp Fiction 1994 8.9 830504
4 The Dark Knight 2008 8.9 1045186
... ... ... ... ...
242 Mystic River 2003 7.9 256159
243 In the Heat of the Night 1967 7.9 37081
244 Arsenic and Old Lace 1944 7.9 45893
245 Before Sunrise 1995 7.9 100974
246 Papillon 1973 7.9 62517

247 rows × 4 columns

print(imdb_2.dtypes)
Film_Adı         object
Yıl               int64
Puan            float64
Oylayan_Kişi      int64
dtype: object

Çıktı incelendiğinde görüyoruz ki, Puan isimli sütun float (ondalıklı sayı) veri tipine dönüşmüş oldu. Yukarıda yaptığımız işlemi (Puan sütununun 2 katını alıp yeni bir sütun olarak veri çerçevesine eklemeyi) tekrar deneyelim.

imdb_2["Puan_2"] = imdb_2["Puan"] * 2
print(imdb_2)
Film_Adı Yıl Puan Oylayan_Kişi Puan_2
0 The Shawshank Redemption 1994 9.2 1071904 18.4
1 The Godfather 1972 9.2 751381 18.4
2 The Godfather: Part II 1974 9.0 488889 18.0
3 Pulp Fiction 1994 8.9 830504 17.8
4 The Dark Knight 2008 8.9 1045186 17.8
... ... ... ... ... ...
242 Mystic River 2003 7.9 256159 15.8
243 In the Heat of the Night 1967 7.9 37081 15.8
244 Arsenic and Old Lace 1944 7.9 45893 15.8
245 Before Sunrise 1995 7.9 100974 15.8
246 Papillon 1973 7.9 62517 15.8

247 rows × 5 columns

İstediğimiz şeyi başardık. Puan_2 sütunu, Puan sütununun 2 katından oluşmuş oldu.

← Önceki Bölüm | Sonraki Bölüm →