Pandas - read_csv
Cts 09 Temmuz 2022read_csv() Fonksiyonu
read_csv fonksiyonu, Pandas kütüphanesinin en önemli araçlarından biridir ve temel olarak virgülle ayrılmış değerler (CSV) formatındaki dosyaları okuyarak bunları Veri Çerçevesi (DataFrame) adı verilen, satır ve sütunlardan oluşan tablo yapısına dönüştürmek için kullanılır.
Basitçe söylemek gerekirse, bu fonksiyon, bilgisayarınızdaki bir veri dosyasını (örneğin, bir Excel dosyasının dışa aktarılan hali gibi) alır ve Python'da kolayca analiz edebileceğiniz, düzenleyebileceğiniz ve işleyebileceğiniz bir tabloya çevirir.
Sözdizimi:
pandas.read_csv(filepath_or_buffer, *, sep=<no_default>,
delimiter=None, header='infer', names=<no_default>,
index_col=None, usecols=None, dtype=None, engine=None,
converters=None, true_values=None, false_values=None,
skipinitialspace=False, skiprows=None, skipfooter=0,
nrows=None, na_values=None, keep_default_na=True,
na_filter=True, verbose=<no_default>, skip_blank_lines=True,
parse_dates=None, infer_datetime_format=<no_default>,
keep_date_col=<no_default>, date_parser=<no_default>,
date_format=None, dayfirst=False, cache_dates=True,
iterator=False, chunksize=None, compression='infer',
thousands=None, decimal='.', lineterminator=None,
quotechar='"', quoting=0, doublequote=True, escapechar=None,
comment=None, encoding=None, encoding_errors='strict',
dialect=None, on_bad_lines='error',
delim_whitespace=<no_default>, low_memory=True,
memory_map=False, float_precision=None, storage_options=None,
dtype_backend=<no_default>)
Temel İşlevi:
pandas.read_csv()'nin yaptığı şey budur:
-
Dosyayı bulur ve açar: Fonksiyona verdiğiniz dosya yolundaki (veya URL'deki) CSV dosyasını açar.
-
Veriyi okur: Dosyanın içeriğini satır satır okur.
-
Ayırıcıyı kullanır: Her satırdaki verilerin hangi karakterle ayrıldığını (genellikle
,virgül, ama bazen;noktalı virgül veya\tsekme olabilir) belirler. -
Tablo oluşturur: Okuduğu veriyi kullanarak bir Pandas DataFrame oluşturur. Bu DataFrame, veriyi tablo şeklinde (sütun başlıkları ve satır indeksleri ile) temsil eder.
Bu fonksiyon, dosyanın nerede olduğunu, hangi ayırıcı karakterin kullanıldığını, hangi satırın başlık (header) olduğunu, hangi sütunların veri tipi (dtype) olduğunu ve daha birçok şeyi kontrol etmeniz için çok sayıda parametreye sahiptir.
Başlıca Parametreleri:
pandas.read_csv() fonksiyonunun en sık kullanılan ve en önemli parametreleri aşağıda tablo halinde açıklanmıştır:
| Parametre | Tipi | Varsayılan Değer | Açıklama |
|---|---|---|---|
filepath_or_buffer |
str, path object veya file-like object | Yok | Okunacak dosyanın yolu (bilgisayarınızdaki konum) veya URL'si (internet adresi). Bu, zorunlu olan tek parametredir. |
sep (veya delimiter) |
str | ',' (virgül) | Veri sütunlarını birbirinden ayırmak için kullanılan karakter. Örneğin, dosya noktalı virgülle ayrılmışsa (name;age;city), sep=';' olarak ayarlanır. |
header |
int, list of int, 'infer' veya None | 'infer' | Sütun isimlerini içeren satırın satır numarası (0'dan başlar). header=0 ilk satırı başlık olarak kullanır. None olarak ayarlanırsa Pandas sütunlara otomatik isimler verir (0, 1, 2...). |
names |
list-like | Yok | Sütun başlıkları için kullanılacak isimlerin listesi. Eğer dosyanın başlık satırı yoksa veya var olan başlıkları geçersiz kılmak istiyorsanız kullanılır. |
index_col |
int, str, list of int veya str | None | Hangi sütunun satır etiketi (index) olarak kullanılacağını belirtir. Sütun adı veya sütun numarası olarak verilebilir. |
dtype |
dtype veya dict | None | Sütunların veri tipini (örneğin, tam sayı, metin, ondalıklı sayı) belirlemek için kullanılır. Örneğin, {'sutun_adı': str} |
skiprows |
int veya list of int | None | Okuma sırasında atlanacak satır sayısı veya atlanacak satır numaralarının listesi. |
na_values |
scalar, list-like veya dict | Varsayılan NA değerleri | Verideki hangi değerlerin eksik veri (NaN) olarak yorumlanacağını belirler. Örneğin, na_values=['N/A', 'eksik']. |
parse_dates |
bool, list of int/str, list of lists veya dict | False | Hangi sütunların tarih ve saat nesnesi olarak ayrıştırılmaya çalışılacağını belirler. True ise dizin sütununu ayrıştırmaya çalışır. |
encoding |
str | 'utf-8' | Dosyanın hangi karakter kodlamasıyla (encoding) yazıldığını belirtir. Türkçe karakter sorunu yaşanıyorsa, encoding='latin1' veya encoding='cp1254' denenebilir. |
header parametresi
read_csv () fonksiyonu, CSV dosyasındaki ilk satırı varsayılan olarak bir başlık kabul eder ve bunu Veri Çerçevesi (DataFrame) sütun adları olarak kullanır. CSV dosyasındaki ilk satırın başlık değil, bir veri olduğu düşünüldüğünde, yani sadece verilerden oluşan CSV dosyası ile çalıştığımızda, header=None parametresi kullanılmalıdır.
İlk olarak bir CSV dosyasını çalışmamıza dahil edip içeriğine bakalım.
import pandas as pd
basliksiz = pd.read_csv("Veri_Setleri/basliksiz.csv")
print(basliksiz
| 9 | 82 | 246 | |
|---|---|---|---|
| 0 | 7 | 78 | 180 |
| 1 | 8 | 83 | 565 |
| 2 | 6 | 82 | 486 |
| 3 | 4 | 37 | 615 |
| 4 | 2 | 18 | 341 |
Yukarıdaki örnekte gördüğünüz üzere, ilk satır başlık değil, veriden oluşuyor. Bunu header=None parametresi ile düzenleyelim.
basliksiz = pd.read_csv("Veri_Setleri/basliksiz.csv", header = None )
print(basliksiz
| 0 | 1 | 2 | |
|---|---|---|---|
| 0 | 9 | 82 | 246 |
| 1 | 7 | 78 | 180 |
| 2 | 8 | 83 | 565 |
| 3 | 6 | 82 | 486 |
| 4 | 4 | 37 | 615 |
Bu durumda sütun isimleri (0, 1, 2) otomatik olarak atanır.
names Parametresi
Sadece verilerden oluşan yani başlık satırı bulunmayan bir CSV dosyası ile çalıştığımızda, header=None parametresi kullanılmalıdır demiştik. Bu durumda Başlık (sütun adlarını) belirtmek için names parametresi kullanılmalı. names parametresine değer olarak, sütun sayısı ile eş uzunlukta bir liste tipi veri atanmalı.
Yukarıdaki örnekte gördüğünüz üzere, 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_csv("Veri_Setleri/basliksiz.csv",
header = None, names = baslik )
print(basliksiz
| Birler | Onlar | Yüzler | |
|---|---|---|---|
| 0 | 9 | 82 | 246 |
| 1 | 7 | 78 | 180 |
| 2 | 8 | 83 | 565 |
| 3 | 6 | 82 | 486 |
| 4 | 4 | 37 | 615 |
sep veya delimiter Parametreleri:
Çalıştığımız dosyada verileri birbirinden ayırmak için kullanılan karakteri belirtmek için sep ya da delimiter parametreleri kullanılır. İkisi de aynı sonucu verir. Örneğin, dosyadaki bilgiler birbirinden noktalı virgülle ayrılmışsa (örneğin: name; age; city), sep=';' olarak ayarlanır.
Örnek Verimiz (csv dosya içeriğimiz);
0 | 9 | 82 | 246
1 | 7 | 78 | 180
2 | 8 | 83 | 565
3 | 6 | 82 | 486
4 | 4 | 37 | 615
Elimizde, yukarıdaki gibi | pipe karakteri ile ayrılmış verilerden oluşan bir csv dosyası olduğunu düşünürsek, read_csv() metodunun sep ya da delimiter parametresini | pipe karakteri ile işaret etmemiz gerekir.
import pandas as pd
baslik = ["Birler", "Onlar", "Yüzler"]
df = pd.read_csv("csv.csv",
delimiter = "|", # sep = "|" ifadesi de yazılabilir
header = None, names = baslik)
print(df)
Çıktı:
Birler Onlar Yüzler
0 9 82 246
1 7 78 180
2 8 83 565
3 6 82 486
4 4 37 615
index_col Parametresi
index_col parametresini anlatmak için nba.csv isimli dosyasınının içeriğini çalışmamıza aktarıp, veri çerçevesine dönüştürelim;
import pandas as pd
nba_csv = pd.read_csv("Veri_Setleri/nba.csv")
print(nba_csv)
| Name | Team | Number | Position | Age | Height | Weight | College | Salary | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | Avery Bradley | Boston Celtics | 0.0 | PG | 25.0 | 6-2 | 180.0 | Texas | 7730337.0 |
| 1 | Jae Crowder | Boston Celtics | 99.0 | SF | 25.0 | 6-6 | 235.0 | Marquette | 6796117.0 |
| 2 | John Holland | Boston Celtics | 30.0 | SG | 27.0 | 6-5 | 205.0 | Boston University | NaN |
| 3 | R.J. Hunter | Boston Celtics | 28.0 | SG | 22.0 | 6-5 | 185.0 | Georgia State | 1148640.0 |
| 4 | Jonas Jerebko | Boston Celtics | 8.0 | PF | 29.0 | 6-10 | 231.0 | NaN | 5000000.0 |
Harici kaynaktan veri alarak oluşturduğumuz veri çerçevesinin indeks değerini, istediğimiz sütuna eşitleyebiliriz. Bunu yapmak için index_col parametresini kullanmalıyız. Örneğin NBA oyuncularının verileri barındıran CSV uzantılı dosyanın Name Sütununu, veri çerçevemizin indeks sütunu haline getirip veri çerçevemize göz atalım.
nba_csv = pd.read_csv("Veri_Setleri/nba.csv", index_col="Name")
print(nba_csv.head())
| Team | Number | Position | Age | Height | Weight | College | Salary | |
|---|---|---|---|---|---|---|---|---|
| Name | ||||||||
| Avery Bradley | Boston Celtics | 0.0 | PG | 25.0 | 6-2 | 180.0 | Texas | 7730337.0 |
| Jae Crowder | Boston Celtics | 99.0 | SF | 25.0 | 6-6 | 235.0 | Marquette | 6796117.0 |
| John Holland | Boston Celtics | 30.0 | SG | 27.0 | 6-5 | 205.0 | Boston University | NaN |
| R.J. Hunter | Boston Celtics | 28.0 | SG | 22.0 | 6-5 | 185.0 | Georgia State | 1148640.0 |
| Jonas Jerebko | Boston Celtics | 8.0 | PF | 29.0 | 6-10 | 231.0 | NaN | 5000000.0 |
Gördüğünüz gibi artık indeks bilgileri, Oyuncu isimlerine dönüşmüş oldu.
F-String ile Veri Biçimlendirmek
Ondalık Ayırıcı
CSV dosyası okurken birlikte kullanılabilecek pek çok parametre vardır. Kodun okunurluğunu artırmak adına aşağıdaki gibi farklı yazım tarzı da kullanılabilir. Bir örnekle açıklayalım.
import pandas as pd
df = (pd
.read_csv("nba.csv", index_col="Name")
.groupby("Team")["Age"].mean()
.nlargest(10)
.map(lambda x: f"{x:.2f}")
)
Yukarıdaki kodun çıktısına print(df) komutu ile bakıp, kod parçalarını teker teker açıklayalım.
Çıktı:
Team
San Antonio Spurs 31.60
Dallas Mavericks 29.73
Cleveland Cavaliers 29.53
Los Angeles Clippers 29.47
Miami Heat 28.93
Memphis Grizzlies 28.39
Atlanta Hawks 28.20
Washington Wizards 27.87
Golden State Warriors 27.67
Los Angeles Lakers 27.53
Name: Age, dtype: object
Kod parçalarını açıklayalım;
.read_csv("nba.csv", index_col="Name")
Bu kod, py uzantılı dosya ile aynı konumdaki nba.csv dosyasını, veri çerçevesine dönüştürüp df adına atar. index bilgisi olarak Name sütunu ayarlanır.
.groupby("Team")["Age"].mean()
Team yani Takım adına göre gruplama yapılır, Age yani Yaş ortalamaları hesaplatılır.
.nlargest(10)
En büyük 10 değer seçilir.
.map(lambda x: f"{x:.2f}")
Hesaplanan yaş ortalamalarının ondalık kısmı 2 basamakla sınırlandırılır.
Binlik Ayırıcı
Bir de Salary (Maaş) bilgilerine göre sıralama yapalım ve binlik ayırıcıyı görelim.
Maaş ortalamalarına göre en yüksek 15 Takım bilgisini görelim;
import pandas as pd
df = (pd
.read_csv("nba.csv", index_col="Name")
.groupby("Team")["Salary"].mean()
.nlargest(15)
.map(lambda x: f"${x:.2f}")
)
print(df)
Çıktı:
Team
Cleveland Cavaliers $7642049.21
Miami Heat $6347359.46
Los Angeles Clippers $6323642.67
Oklahoma City Thunder $6251019.87
Golden State Warriors $5924599.80
Chicago Bulls $5785558.53
San Antonio Spurs $5629515.53
Memphis Grizzlies $5467920.00
Charlotte Hornets $5222728.00
Washington Wizards $5088575.73
Houston Rockets $5018868.07
Atlanta Hawks $4860196.67
Los Angeles Lakers $4784695.40
Sacramento Kings $4778911.07
Dallas Mavericks $4746582.13
Name: Salary, dtype: object
Ondalık ayırıcı 2 basamakla sınırlandırıldı ancak binlik ayırıcı ayarlanmadı. O nedenle ücretlerin okunması zor. Kodun .map(lambda x: f"${x:.2f}" kısmında .2f 'ten önce virgül konulursa .map(lambda x: f"${x:,.2f}" binlik ayırıcı olarak virgül belirlenmiş olur. f"${x:,.2f} ifadeki $ ifadesi ise değerin önüne dolar sembolü ($) eklemek için kullanılır. `Kodu ve çıktısını görelim;
import pandas as pd
df = (pd
.read_csv("nba.csv", index_col="Name")
.groupby("Team")["Salary"].mean()
.nlargest(15)
.map(lambda x: f"${x:,.2f}")
)
print(df)
Çıktı:
Team
Cleveland Cavaliers $7,642,049.21
Miami Heat $6,347,359.46
Los Angeles Clippers $6,323,642.67
Oklahoma City Thunder $6,251,019.87
Golden State Warriors $5,924,599.80
Chicago Bulls $5,785,558.53
San Antonio Spurs $5,629,515.53
Memphis Grizzlies $5,467,920.00
Charlotte Hornets $5,222,728.00
Washington Wizards $5,088,575.73
Houston Rockets $5,018,868.07
Atlanta Hawks $4,860,196.67
Los Angeles Lakers $4,784,695.40
Sacramento Kings $4,778,911.07
Dallas Mavericks $4,746,582.13
Name: Salary, dtype: object
Görüldüğü gibi, maaşın binlik kısımları virgül ile ayrılmı oldu ve okunurluğu kolaylaştırıldı.
İstersek Binlik ayırıcı olarak virgül , yerine alt çizgi _ karakteri de kullanılabilir.
import pandas as pd
df = (pd
.read_csv("nba.csv", index_col="Name")
.groupby("Team")["Salary"].mean()
.nlargest(15)
.map(lambda x: f"${x:_.2f}")
)
print(df)
Çıktı:
Team
Cleveland Cavaliers $7_642_049.21
Miami Heat $6_347_359.46
Los Angeles Clippers $6_323_642.67
Oklahoma City Thunder $6_251_019.87
Golden State Warriors $5_924_599.80
Chicago Bulls $5_785_558.53
San Antonio Spurs $5_629_515.53
Memphis Grizzlies $5_467_920.00
Charlotte Hornets $5_222_728.00
Washington Wizards $5_088_575.73
Houston Rockets $5_018_868.07
Atlanta Hawks $4_860_196.67
Los Angeles Lakers $4_784_695.40
Sacramento Kings $4_778_911.07
Dallas Mavericks $4_746_582.13
Name: Salary, dtype: object
F-String konusunu incelemek isterseniz, konunun detaylarına BURADAN ulaşabilirsiniz.