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.
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.
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)

