Pandas'ın read_csv() fonksiyonunda Python Örnek ile

⚡ Akıllı Özet

Pandas'ın `read_csv()` fonksiyonu, virgülle ayrılmış bir dosyayı (yerel veya uzak) tek bir çağrıda DataFrame'e dönüştürür. Bu kılavuz, UCI yetişkin nüfus sayımı veri setini içe aktarır, on beş sütununu adlandırır ve sonucu `groupby` toplama işlemleriyle özetler.

  • 🔘 Bir çağrı: pd.read_csv() bir dosya yolu ve bir parametre kabul eder. URLveya okuma yöntemi sunan herhangi bir nesne.
  • ☑️ Sütun kontrolü: Sütunları etiketlemek için isimler girin ve düz bir tamsayı dizini tutmak için index_col=False değerini kullanın.
  • Beyaz boşluk: skipinitialspace=True seçeneği, yetişkin veri setindeki her virgülden sonra gelen boşluğu kaldırır.
  • 🧪 Gruplandırma ve toplama: `groupby()` fonksiyonu, veri setindeki değerleri sayı, minimum, maksimum, ortalama, medyan veya standart sapma ile özetler.
  • Büyük dosyalar: `usecols`, `dtype` ve `chunksize` parametreleri, çok gigabaytlık dışa aktarımlarda ayrıştırma süresini ve bellek kullanımını azaltır.
  • ⚠️ Genel hatalar: Kodlama, hatalı satırlar ve karışık veri tipleri gibi sorunların her birini düzelten belgelenmiş bir argüman mevcuttur.

Örnekle Pandalar read_csv()

Pandas'ta CSV'yi içe aktar

TensorFlow eğitiminde şunları kullanacaksınız: yetişkin veri setiBu dosya genellikle sınıflandırma görevlerinde kullanılır. Aşağıda kullanılan dosya ham veridir. adult.data UCI Makine Öğrenimi Deposundan dışa aktarma ve veri seti sayfası ayrıca sıkıştırılmış indirme seçeneği de sunmaktadır. ucimlrepo Doğrudan yolun çözümlenmesi durduğunda paketi yükleyin.

Veriler CSV formatında saklanmaktadır. Veri seti 8 kategorik değişken içermektedir:

  • çalışma sınıfı
  • eğitim
  • evlilik
  • işgal
  • ilişki
  • yarış
  • seks
  • ana vatan

Ve 6 sürekli değişken:

  • yaş
  • fnlwgt
  • eğitim_num
  • Sermaye kazancı
  • sermaye_kaybı
  • saat_hafta

gelirle birlikte label sütun, bu da ona ileteceğiniz 15 sütun adını oluşturur. Pandalar sonraki bölümde.

Pandalar read_csv() Yöntemi

CSV veri setini içe aktarmak için `pd.read_csv()` nesnesini kullanabilirsiniz. Temel imza şu şekildedir:

Pandalar read_csv() Söz Dizimi

pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
  • dosya_yolu_veya_tampon: yol, URLveya verileri içeren dosya benzeri nesne
  • ayırıcı=',': kullanılacak ayırıcı
  • isimler=YokSütunları adlandırın. Veri setinde on sütun varsa, on isim vermeniz gerekir.
  • index_col=Yok: Satır indeksi olarak hangi sütunun kullanılacağı. Yeni bir tamsayı indeksi zorlamak için False değerini geçin.
  • İlk boşluğu atla=Yanlış: Ayırıcıdan sonraki boşlukları atla

Tüm argümanların tam listesi için resmi belgeye bakın. pandas.read_csv() dokümantasyonu.

Pandalar read_csv() Örnek

Aşağıdaki kod parçası 15 sütunun tamamını adlandırır, UCI dosyasını işaret eder ve bu veri kümesindeki her virgülün ardından gelen boşluğu kaldırır.

## Import csv
import pandas as pd
## Define path data
COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital',
           'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss',
           'hours_week', 'native_country', 'label']
PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"
df_train = pd.read_csv(PATH,
                       skipinitialspace=True,
                       names = COLUMNS,
                       index_col=False)
df_train.shape

Çıktı:

(32561, 15)

Yapı 32,561 satır ve 15 sütundan oluştuğunu doğruluyor, bu nedenle SÜTUNLAR'daki her isim dosyadaki bir alanla eşleştirildi.

Pandas read_csv() fonksiyonunun temel parametreleri

`read_csv()` fonksiyonu elliden fazla argüman kabul eder, ancak küçük bir grup neredeyse tüm gerçek içe aktarma işlemlerini kapsar. Aşağıdaki varsayılan değerler, mevcut pandas API referansında belgelenenlerdir.

Parametre Varsayılan Ne yapar
Eylül '' Ayırıcı olarak kullanılan karakter veya düzenli ifade. Diğer formatlar için sep=';' veya sep='\t' kullanın.
başlık 'çıkarım' Sütun etiketlerini içeren satır numarası. Dosyada başlık satırı yoksa header=None parametresini kullanın.
isimleri ayarlanmadı Sütun etiketlerinin açık listesi. Mevcut bir başlığı değiştirmek için header=0 ile birlikte kullanın.
indeks_sütun Hayır Satır indeksi olarak kullanılacak sütun. index_col=False, düz bir tamsayı indeksi zorunlu kılar.
usecols Hayır Yüklenecek sütunların etiket veya konuma göre alt kümesi. Hem ayrıştırma süresini hem de bellek kullanımını azaltır.
tip Hayır Sütun başına veri tipleri, örneğin {'age': 'int32'}. Tip çıkarımını atlar.
na_değerleri Hayır NaN olarak okunacak ek dizeler, örneğin yetişkin veri setindeki '?' yer tutucusu.
satır atla / satır yok Hayır Başlangıçtaki satırları atlayın veya yalnızca ilk N veri satırını okuyun.
ayrıştırma_tarihleri Hayır Okuma sırasında tarih ve saate dönüştürülecek sütunlar, tarih biçimiyle birlikte.
kodlama 'utf-8' Dosyanın metin kodlaması. Eski dışa aktarımlar için 'latin-1' veya 'cp1252' kullanın.
Parça boyutu Hayır N satırlık bloklar halinde dosyayı veren bir yineleyici döndürün.
kötü satırlarda 'hata' Hatalı satırlarla ne yapılmalı: yükseltme, uyarı verme veya atlama.

Bunlardan ikisi not düşmeyi hak ediyor. index_col=False Bu, ayarlanmamış bırakmakla aynı şey değil: Pandas'a ilk sütunu yükseltmemesini açıkça söylüyor, ki bu da dosyanın her satırının sonunda gereksiz bir ayırıcı olduğunda istediğiniz şeydir. Ve names Dosyanın belirttiği her şeyi sessizce üzerine yazar, bu yüzden geçin. header=0 CSV dosyası gerçekten bir başlık satırı içeriyorsa, bunun yanında.

Pandalar groupby() Yöntemi

Verileri görmenin kolay bir yolu, `groupby` yöntemini kullanmaktır. Bu yöntem, verileri gruplara göre özetlemenize yardımcı olabilir. `groupby()` yöntemiyle kullanılabilen toplama işlemlerinin listesi aşağıdadır:

  • saymak: saymak
  • dk: dk
  • maksimum: maksimum
  • demek: demek
  • medyan: medyan
  • standart sapma: std
  • ve diğerleri

`groupby()` fonksiyonunun içinde, toplama işlemini uygulamadan önce gruplandırmak istediğiniz sütunu belirtirsiniz.

Şimdi tek bir gruba göz atalım.ping Yetişkin veri setiyle, gelir türüne göre (50 TL üzeri veya 50 TL altı) tüm sürekli değişkenlerin ortalamasını elde edeceksiniz:

df_train.groupby(['label']).mean()
etiket yaş fnlwgt eğitim_num Sermaye kazancı sermaye_kaybı saat_hafta
<=50K 36.783738 190340.86517 9.595065 148.752468 53.142921 38.840210
> 50K 44.249841 188005.00000 11.611657 4006.142456 195.001530 45.473026

Hane halkı türüne göre minimum yaş sınırını öğrenebilirsiniz:

df_train.groupby(['label'])['age'].min()
label
<=50K    17
>50K     19
Name: age, dtype: int64

Ayrıca birden çok sütuna göre gruplandırabilirsiniz. Mesela hane tipine ve medeni duruma göre maksimum sermaye kazancını elde edebilirsiniz.

df_train.groupby(['label', 'marital'])['capital_gain'].max()
label  marital
<=50K  Divorced                 34095
       Married-AF-spouse         2653
       Married-civ-spouse       41310
       Married-spouse-absent     6849
       Never-married            34095
       Separated                 7443
       Widowed                   6849
>50K   Divorced                 99999
       Married-AF-spouse         7298
       Married-civ-spouse       99999
       Married-spouse-absent    99999
       Never-married            99999
       Separated                99999
       Widowed                  99999
Name: capital_gain, dtype: int64

Gruplandırma işleminden sonra grafik oluşturabilirsiniz. Bunu yapmanın bir yolu, gruplandırılmış sonucu doğrudan grafiğe aktarmaktır.

Daha net bir grafik oluşturmak için, medeni durumun indeksten sütunlara taşınması amacıyla mean() işleminden sonra unstack() uygulayın. Bu sayede grafik, düz çok seviyeli bir indeksin üreteceği on dört (2*7) çubuk yerine, gelir etiketi başına bir olmak üzere iki gruba sahip olur.

Eğer bir Jupyter defterLütfen %matplotlib satır içi kodunu eklemeyi unutmayın, aksi takdirde grafik görüntülenmeyecektir.

%matplotlib inline
df_plot = df_train.groupby(['label', 'marital'])['capital_gain'].mean().unstack()
df_plot

Bu yığılmamış çerçeveyi çubuk grafik olarak çizdiğimizde aşağıdaki şekil elde edilir.

Gelir düzeyi ve medeni duruma göre ortalama sermaye kazancının gruplandırılmış çubuk grafiği

Pandas ile Büyük CSV Dosyaları Nasıl Okunur?

Yetişkin veri seti küçük, ancak aynı işlem çok gigabaytlık bir dışa aktarımda takılıp kalabiliyor. Üç argüman işin büyük kısmını hallediyor.

  • usecols Yalnızca gerçekten ihtiyacınız olan sütunları yükler. Pandas belgelerinde bunun çok daha hızlı ayrıştırma ve daha düşük bellek kullanımıyla sonuçlandığı belirtiliyor.
  • tip Her sütunu bir türe sabitler, böylece Pandas varsayılan olarak çıkarım işlemini atlar ve tamsayıları 64 bit'e genişletmez.
  • Parça boyutu Bir DataFrame yerine bir TextFileReader döndürür; bu sayede N satırlık bloklar üzerinde döngü yapabilir ve ilerledikçe toplama işlemleri gerçekleştirebilirsiniz.
import pandas as pd

# read only the columns you need, with explicit types
cols  = ['age', 'education', 'capital_gain', 'label']
types = {'age': 'int32', 'capital_gain': 'int32'}
df = pd.read_csv(PATH, names=COLUMNS, usecols=cols, dtype=types,
                 skipinitialspace=True, index_col=False)

# stream the file in fixed-size chunks instead of loading it whole
total = 0
for chunk in pd.read_csv(PATH, names=COLUMNS, chunksize=10000,
                         skipinitialspace=True, index_col=False):
    total = total + len(chunk)
print(total)

Temeller yerine getirildikten sonra iki ek seçenek daha yardımcı olur. engine='pyarrow' Çoklu iş parçacıklı Arrow ayrıştırıcısına geçiş yapar ve dtype_backend='pyarrow' Sonucu ok işaretli sütunlar halinde tutar. low_memory Varsayılan olarak True değeri kullanılır; bu, dosyayı dahili olarak parçalar halinde ayrıştırır, ancak bir sütunda karışık türler oluşturabilir; buna güvenmek yerine açık bir dtype belirleyin.

En sonunda, compression='infer' Bu, .gz, .zip, .bz2, .xz veya .zst ile biten bir dosya yolunun anında sıkıştırılmış halinden çıkarıldığı anlamına gelir; bu nedenle, arşivi okumadan önce açmaya gerek yoktur.

Pandas'ta read_csv() fonksiyonunda sık karşılaşılan hatalar ve bunların nasıl düzeltileceği

read_csv() işlevinin başarısız olma olasılığının çoğu dört nedenden kaynaklanır ve her birinin çözümünü sağlayan belgelenmiş bir argümanı vardır.

Hata Sebeb olmak sabit
Dosya BulunamadıHatası Yol, betiğe göre değil, çalışma dizinine göre belirlenir. Mutlak bir yol kullanın veya onaylayın. URL Kullanılan protokol şeması http, ftp, s3, gs veya file'tan biridir.
UnicodeDecodeError Dosya, varsayılan kodlama olan UTF-8 değil. `encoding='latin-1'` veya doğru codec'i geçirin veya `encoding_errors='replace'` seçeneğini kullanın.
Ayrıştırıcı Hatası: Verilerin ayrıştırılmasında hata oluştu. Bir satır, başlığın belirttiğinden daha fazla alan içerir. on_bad_lines='skip' veya 'warn' parametresini geçirin veya doğru ayırıcı değeri ayarlayın.
DtypeWarning: Sütunlarda farklı veri tipleri mevcut. Parçalı tip çıkarımı, farklı tipleri tek bir sütunda gördü. Belirli bir veri türü (dtype) ayarlayın veya low_memory=False değerini girin.
Sütunlar birer basamak kaydırıldı. Sondaki ayırıcı karakter, Pandas'ın ilk alanı dizine yükseltmesini sağlar. index_col=False değerini geçirin.

Yetişkin veri seti, eksik değer durumunu doğrudan göstermektedir: bilinmeyen iş sınıfı, meslek ve doğum yeri ülkesi girişleri, tam anlamıyla bir soru işareti olarak saklanır; bu nedenle, bunları belirtmediğiniz sürece '?' dizesi olarak gelirler.

# tolerate rows with too many fields instead of raising
df = pd.read_csv(PATH, names=COLUMNS, on_bad_lines='skip')

# read a file that is not UTF-8
df = pd.read_csv('sales.csv', encoding='latin-1')

# treat the dataset's '?' placeholder as a missing value
df = pd.read_csv(PATH, names=COLUMNS, na_values='?', skipinitialspace=True)

SSS

İkisi de aynı ayrıştırıcıyı çağırır. `read_csv()` varsayılan olarak virgül ayırıcı kullanırken, `read_table()` genel olarak ayırıcı içeren bir dosyayı okur ve ayırıcıyı kendiniz ayarlamanızı bekler. Virgülle ayrılmış dosyalar için `read_csv()`, sekme veya dikey çizgiyle ayrılmış dosyalar için ise `read_table()` kullanın.

df.to_csv('output.csv', index=False) fonksiyonunu çağırın. Silin.ping Bu indeks, bir sonraki okumada isimsiz bir ilk sütunun oluşmasını önler. Dosya içe aktarılırken kullandığınız ayarlara paralel olarak sep, encoding veya compression argümanlarını ekleyin.

parse_dates'i sütun adları veya konumlarıyla birlikte geçirin ve düzen ISO 8601 değilse date_format'ı ekleyin, örneğin date_format='%d/%m/%Y'. Bunu eklemezseniz, tarih sütunları düz nesne dizeleri olarak gelir ve ayrı bir to_datetime çağrısı gerektirir.

`sep` parametresini ';' veya '\t' gibi bir karakter olarak ayarlayın. Birden uzun ayırıcılar normal ifadeler olarak ele alınır ve daha yavaş olan işlemi zorlar. Python `engine.sep=None` seçeneği, motorun ayırıcıyı ilk geçerli satırdan algılamasını sağlar.

Döndürülen veri satırı sayısını sınırlamak için `nrows`, baştaki satır bloklarını atlamak için ise `skiprows` kullanın. Bunları birleştirerek dosyada sayfalar arasında geçiş yapabilirsiniz; örneğin, ikinci milyon satırı okumak için `skiprows=1000000` ve `nrows=999999` kullanın.

Evet. Sıkıştırma varsayılan olarak 'çıkarım' olarak ayarlanmıştır, bu nedenle .gz, .zip, .bz2, .xz veya .zst ile biten bir dosya yolu otomatik olarak açılır. URLHTTP, FTP, S3, GS veya dosya kullanarak yapılan tüm işlemler çalışır ve `storage_options`, kimlik bilgilerini uzak arka uca iletir.

Eğitilmiş modeller olası tip hatalarını işaretler, birbirine çok benzeyen kategori yazımlarını kümelendirir ve eksik değerleri çevreleyen sütunlardan doldurur. Bu, manuel temizlemeyi, kural tabanlı na_values ​​veya dtype ayarının kendi başına çözemediği satırlara daraltır.

Copilot, dosyanın bir örneğini gördükten sonra şablonu hızla oluşturur. Argüman listesini taslak olarak değerlendirin, çünkü genellikle veri türünü ve kodlamayı tahmin eder. Çalıştırmadan önce oluşturulan her anahtar kelimeyi pandas API referansıyla karşılaştırın.

Bu yazıyı şu şekilde özetleyin: