KÖTÜ YAPILANDIRILMIŞ EXCEL DOSYALARINI PANDASLA OKUMA

E. Samet Bişkin
4 min readFeb 10, 2021

--

Wikimedia Commons

Giriş

Pandas ile Excel dosyalarını okumak ve verileri DataFrame’e dönüştürmek kolaydır. Maalesef çoğu bilgi içeren Excel dosyaları genellikle kötü yapılandırılmıştır. Verilerin çalışma sayfasına dağıldığı durumlarda, verileri okuma şeklinizi özelleştirmeniz gerekebilir. Bu yazı, pandas’ın ve openpyxl’in bu tür Excel dosyalarını okumak ve verileri daha fazla analiz için uygun bir DataFrame’e temiz bir şekilde dönüştürmek için nasıl kullanılacağını içermektedir.

openpyxl, Excel 2010 xlsx/xlsm/xltx/xltm dosyalarını okumak/yazmak için bir Python kitaplığıdır.

Bu örnekleri uygulamalı yapmak isterseniz, xlsx dosyasını kaggle hesabım üzerinden edinebilirsiniz.

Problem

Pandas’ın read_excel fonksiyonu, Excel çalışma sayfalarını okumak için mükemmel bir iş çıkarır. Ancak, verilerin A1 hücresinden başlayan sürekli bir tablo olmadığı durumlarda, sonuçlar beklediğiniz gibi olmayabilir. Bu örnek tabloyu read_excel(src_file) kullanarak okumaya çalışırsanız alttaki gibi dağınık ve boş sütunlar verecektir;

Şuna benzer bir şey alacaksınız;

Bu sonuçlar, çok sayıda Adsız sütun, bir satır içindeki başlık etiketlerinin yanı sıra ihtiyacımız olmayan birkaç ekstra sütun içeriyor.

Pandas Çözümü

Bu veri kümesi için en basit çözüm, header ve usecols argümanlarını read_excel() için kullanmaktır. Özellikle usecols parametresi eklemek istediğiniz sütunları kontrol etmek için çok yararlı olabilir.

İşte sadece ihtiyacımız olan verileri okumak için alternatif bir yaklaşım.

Elde edilen DataFrame yalnızca ihtiyacımız olan verileri içerir. Bu örnekte, özellikle notlar sütununu ve tarih alanını hariç tutuyoruz;

Mantık, görece basittir. usecols, B:F gibi Excel sütun aralıklarını kabul edebilir ve yalnızca bu sütunları okuyabilir. Başlık parametresi, başlık sütununu tanımlayan tek bir tam sayı bekler. Bu değer 0 dizinlidir, bu nedenle Excel’de 2. satır olmasına rağmen 1'i geçiyoruz.

Bazı durumlarda, sütunları bir sayı listesi olarak tanımlamak isteyebiliriz. Bu örnekte, tam sayıların listesini tanımlayabiliriz;

Bu yaklaşım, büyük bir veri kümesi için takip etmek istediğiniz bir tür sayısal modeliniz varsa yararlı olabilir (yani, her 3. sütunda veya yalnızca çift numaralı sütunlar).

Pandas usecols ayrıca sütun adlarının bir listesini de alabilir. Bu kod eşdeğer bir DataFrame oluşturacaktır;

Sütun sırası değişirse adlandırılmış sütunların bir listesini kullanmak yardımcı olacaktır, ancak adların değişmeyeceğini biliyorsunuz.

Son olarak, usecols çağrılabilir bir işlev alabilir. Burada, adsız sütunları ve öncelik sütununu hariç tutan basit bir uzun biçimli örnek verilmiştir.

Akılda tutulması gereken temel kavram, işlevin her bir sütunu ada göre ayrıştıracağı ve her sütun için bir Doğru(True) veya Yanlış(False) döndürmesi gerektiğidir. Doğru(True) olarak değerlendirilen sütunlar dahil edilecektir.

Çağrılabilir kullanmanın başka bir yaklaşımı, lambda ifadesi eklemektir. Burada yalnızca tanımlı sütun listesi eklemek istediğimiz bir örnek var. Karşılaştırma amacıyla isimleri küçük harfe çevirerek normalize ediyoruz.

Çağrılabilir işlevler, Excel dosyalarının karışıklığıyla başa çıkmak için bize çok fazla esneklik sağlar.

Aralıklar ve Tablolar

Bazı durumlarda, veriler Excel’de daha da karmaşık hale gelebilir. Bu örnekte, okumak istediğimiz ship_cost adında bir tablomuz var. Bunun gibi bir dosyayla çalışmanız gerekiyorsa, şimdiye kadar tartıştığımız pandas seçeneklerini okumak zor olabilir.

Bu durumda, dosyayı ayrıştırmak ve verileri bir pandas DataFrame’e dönüştürmek için doğrudan openpyxl’i kullanabiliriz. Verilerin bir Excel tablosunda olması bu işlemi biraz daha kolaylaştırabilir.

Excel dosyasını okumak için openpyxl’i (yüklendikten sonra) şu şekilde kullanabilirsiniz;

Bu, tüm çalışma kitabını yükler. Tüm sayfaları görmek istiyorsak;

Belirli sayfaya erişmek için;

Tüm adlandırılmış tabloların bir listesini görmek için;

Bu anahtar, Excel’de tabloya atadığımız isme karşılık gelir. Şimdi eşdeğer Excel aralığını elde etmek için tabloya erişiyoruz;

Artık yüklemek istediğimiz veri aralığını biliyoruz. Son adım, bu aralığı pandas DataFrame’ine dönüştürmektir. Her satırda döngü yapmak ve bir DataFrame’e dönüştürmek için kısa bir kod yapısı;

Sonuçta ortaya çıkan DataFrame şu şekildedir;

Sonuç olarak temiz bir veri tablosu elde ettik ve daha fazla hesaplama için kullanabiliriz.

Özet

Bu yazıdaki örneklerde, tabloyu daha iyi biçimlendirmek için satırları ve sütunları kolayca silebilirsiniz. Bununla birlikte, bunun uygulanabilir veya tavsiye edilmediği zamanlar vardır. İyi haber şu ki, excel tabloları ne kadar karmaşık olursa olsun pandas ve openpyxl bize Excel verilerini okumak için ihtiyaç duyduğumuz tüm araçları sağlıyor.

--

--