Ana içeriğe geç

Bir Pandas DataFrame'ini CSV Olarak Nasıl Kaydedersiniz

Pandas'ta bir DataFrame'i df.to_csv('your_file_name.csv', index=False) yöntemiyle CSV dosyasına kaydedebilirsiniz; burada df sizin DataFrame'inizdir ve index=False bir indeks sütununun eklenmesini engeller.
· 7 dk. oku

Yapay Zeka ile Keşfedin

Bir DataFrame oluşturur ya da mevcut birini değiştirirseniz, başkalarının üzerinde çalışabilmesi için dışa aktarmak ya da gelecekteki çalışmalarınız için kaydetmek isteyebilirsiniz. Örneğin, bir makine öğrenmesi projesinden bir tahmini değerlendiricinize göndermeniz ya da değiştirilmiş bir veri kümesini bir çalışma arkadaşınıza iletmeniz gerekebilir.

Python'da, bir DataFrame'i Pandas'ın .to_csv() yöntemini kullanarak CSV dosyası olarak dışa aktarabilirsiniz.

Bu yazıda, sürecin temel adımlarında sizi yönlendirecek ve yöntemin parametrelerini açıklayacağım.

Pandas hakkında daha fazla bilgi edinmek isterseniz, şu kursa göz atın: Pandas ile Veri Manipülasyonu.

Acele edenler için hızlı bir yanıtla başlayacağım, ardından ayrıntılara gireceğim.

Kısa Cevap: Pandas DataFrame CSV'ye Nasıl Kaydedilir

Bir Pandas DataFrame'ini CSV olarak kaydetmek için DataFrame.to_csv() yöntemini kullanın: 

df.to_csv('your_file_name.csv', index=False)

'your_file_name.csv' ifadesini dosyanız için istediğiniz ad ve yol ile değiştirin. index=False bağımsız değişkeni, Pandas'ın CSV'nize bir indeks sütunu eklemesini engeller.

Bir Pandas DataFrame'i Oluşturma

Şimdi daha uzun cevaba bakalım. Sıfırdan bir DataFrame oluşturmak yerine, bir veri kümesini içe aktaracağım, üzerinde değişiklik yapacağım ve ortaya çıkan DataFrame'i CSV formatında kaydedeceğim. İlk adım gerekli kütüphaneleri içe aktarmaktır:

import pandas as pd
import seaborn as sns
from sklearn.preprocessing import MinMaxScaler

Ardından bir seaborn veri kümesini içe aktarabiliriz. İçe aktarılan veri kümesi zaten bir Pandas DataFrame'idir, bu yüzden dönüştürmemize gerek yok.

# We’ll import the 'titanic' dataset from seaborn
df = sns.load_dataset('titanic')
print(df.head())
survived  pclass     sex   age  sibsp  parch     fare embarked  class  
0         0       3    male  22.0      1      0   7.2500        S  Third   
1         1       1  female  38.0      1      0  71.2833        C  First   
2         1       3  female  26.0      0      0   7.9250        S  Third   
3         1       1  female  35.0      1      0  53.1000        S  First   
4         0       3    male  35.0      0      0   8.0500        S  Third 
    who  adult_male deck  embark_town alive  alone  
0    man        True  NaN  Southampton    no  False  
1  woman       False    C    Cherbourg   yes  False  
2  woman       False  NaN  Southampton   yes   True  
3  woman       False    C  Southampton   yes  False  
4    man        True  NaN  Southampton    no   True  

Bir Pandas DataFrame'ini Değiştirme

Şimdi yeni bir DataFrame elde etmek için biraz işlem yapalım. Amacım Pandas'taki .to_csv() yöntemini incelemek olduğundan, yalnızca sayısal değişkenlerde min-maks normalizasyonu yapacağım.

scaler = MinMaxScaler()
# Choose the columns that have integer or float data-types                                           
numerical columns - df.select_dtypes(include=['float64','int64']).columns
new_df = df.copy()
# The min-max scaler will represent all numbers on a 0-to-1 scale
new_df[numerical_columns] = scaler.fit_transform(df[numerical_columns])
print(new_df.head())
survived  pclass     sex       age  sibsp  parch      fare embarked    
0       0.0     1.0    male  0.271174  0.125    0.0  0.014151        S  
1       1.0     0.0  female  0.472229  0.125    0.0  0.139136        C  
2       1.0     1.0  female  0.321438  0.000    0.0  0.015469        S  
3       1.0     0.0  female  0.434531  0.125    0.0  0.103644        S  
4       0.0     1.0    male  0.434531  0.000    0.0  0.015713        S  
class   who  adult_male deck  embark_town alive  alone  
Third   man        True  NaN  Southampton    no  False  
First   woman      False   C    Cherbourg   yes  False  
Third   woman      False NaN  Southampton   yes   True  
First   woman      False   C  Southampton   yes  False  
Third   man        True  NaN  Southampton    no   True  

Bir Pandas DataFrame'ini CSV Olarak Kaydetme

Değiştirilmiş DataFrame'i bir CSV dosyası olarak kaydetmek için DataFrame.to_csv() yöntemini kullanacağız.

new_df.to_csv('new_titanic.csv') 

Bu, CSV dosyasını mevcut dizine kaydeder. Hatırlatmaya ihtiyacınız varsa, Python'da geçerli dizin nasıl alınır konulu bu eğitimi okuyun.

Bu yöntemi çağırma şeklim, tüm parametrelerin varsayılan değerlere ayarlanmasını sağladı. Şimdi parametreleri ve ihtiyaçlarınıza göre değerlerini nasıl değiştirebileceğinizi sunacağım.

DataFrame.to_csv() Parametrelerinin Açıklaması

İşte aynı .to_csv() yöntemi, tüm parametreleriyle listelenmiş hâli:

new_df.to_csv(
    path_or_buf='new_titanic.csv',
    sep=',',
    na_rep='',
    float_format=None,
    columns=[],
    header=True,
    index=True,
    index_label=None,
    mode='w',
    encoding='utf-8',
    quoting=csv.QUOTE_MINIMAL,
    lineterminator=os.linesep,
    storage_options={},
    compression='infer',
    quotechar='',
    chunksize=None,
    date_format=None,
    doublequote=True,
    escapechar=None,
    decimal='.',
    errors='strict'
)

Bu parametrelerden bazıları isteğe bağlıdır; örneğin columns, encoding, quoting, lineterminator ve storage_options; bu nedenle onlar için değerler belirttim, ancak bunlar illa ki varsayılan değerler değildir.

İlk parametre bir dosya adı olacak bir dize ya da bir dosya nesnesi olabilir. Şu örneğe bakın:

with open('new_titanic.csv',  'w', encoding = 'utf=8') as file:
     new_df.to_csv(file)

Ayırıcılar ve eksik değerler

Sıradaki parametre ayırıcıdır ve verilerin nasıl ayrılacağını ifade eder. Varsayılan ayırıcı virgüldür, ancak bunu sekme ya da noktalı virgül olarak değiştirebiliriz. Dışa aktarılan verilerinizin belirli bir formatta olması gerektiğinde sekme ya da noktalı virgül ayırıcı yararlı olabilir. Ayrıca, metin gibi virgül içeren verilerde ayırıcı olarak virgül kullanmak istenmeyen değişikliklere yol açabilir.

Örneğin, bir veri noktası olarak ‘Hello, world’ varsa ve ayırıcı olarak virgül kullanmak istiyorsanız, onu tek bir veri noktası olarak tutmak için ayrıca tırnak işareti de gerekir. Bunun yerine sekme ya da noktalı virgül kullanmak daha iyi bir seçenek olabilir; çünkü virgül ve tırnak işaretleri kullanmaya kıyasla daha az bellek tüketebilir.

new_df.to_csv('new_titanic.csv', sep = '\t')
new_df_tab = pd.read_csv('new_titanic.csv')
0\t0\t3\tmale\t22.0\t1\t0\t7.25\tS\tThird\tman...                                                                 
1\t1\t1\tfemale\t38.0\t1\t0\t71.2833\tC\tFirst...                                                                 
2\t1\t3\tfemale\t26.0\t0\t0\t7.925\tS\tThird\t...                                                                 
3\t1\t1\tfemale\t35.0\t1\t0\t53.1\tS\tFirst\tw...                                                                 
4\t0\t3\tmale\t35.0\t0\t0\t8.05\tS\tThird\tman... 

Üçüncü parametre olan na_rep, eksik değerlerin nasıl gösterileceğini belirler. Yaygın seçenekler, hücreyi boş bırakmak ya da ‘NaN’ veya ‘Na’ eklemektir; ancak özel bir dize de ekleyebilirsiniz. Aşağıdaki örnekte, her eksik değer için ‘Datacamp’ ekleyeceğim.

new_df.to_csv('new_titanic.csv', na_rep='Datacamp')
new_df_datacamp = pd.read_csv('new_titanic.csv') 
new_df_datacamp = pd.DataFrame(new_df_datacamp) 
#find the missing values
missing_values = new_df_datacamp.isnull().sum()
print(missing_values)
survived         0
pclass           0
sex              0
age            177
sibsp            0
parch            0
fare             0
embarked         2
class            0
who              0
adult_male       0
deck           688
embark_town      2
alive            0
alone            0

Sütunlar ve indekslerle çalışmak

Gelin, age sütunu için eksik değerlerin nasıl gösterildiğine bakalım:

print(new_df_datacamp['age'][:10])
     0.2711736617240512
     0.4722292033174164
    0.32143754712239253
     0.4345312892686604
     0.4345312892686604
               Datacamp
     0.6732847449107816
    0.01985423473234481
    0.33400351847197784
    0.17064589092736868

Daha az ondalık basamak istiyorsanız, ondalık sayısını belirtmek için float_format parametresini kullanın. Burada yalnızca üç basamak kullanacağız.

new_df.to_csv('new_titanic.csv', na_rep='Datacamp', float_format='%.3f')
new_df_datacamp = pd.read_csv('new_titanic.csv')
new_df_datacamp = pd.DataFrame(new_df_datacamp)
print(new_df_datacamp['age'][:10])
0.271
0.472
0.321
0.435
0.435
Datacamp
0.673
0.020
0.334
0.171

İndeksi görmek istemiyorsanız, index parametresini False olarak ayarlayın.

Ayrıca header parametresini kullanıp True ya da False ayarlayarak sütun adlarını tutup tutmayacağınıza karar verebilirsiniz (ya da sütunlar için adları belirleyebilirsiniz).

columns parametresi hangi sütunların tutulacağını seçmenize olanak tanır. index_label parametresi, indeks sütunu için bir ad belirlemenize ya da birden fazla indeksiniz varsa adlardan oluşan bir liste vermenize olanak tanır.

new_df.to_csv(
    'new_titanic.csv', 
    index=True, 
    header=True, 
    columns=['age', 'alive'], 
    index_label='Index'
)
new_df = pd.read_csv('new_titanic.csv')
new_df = pd.DataFrame(new_df)
print(new_df.head())
  Index       age alive
      0  0.271174    no
      1  0.472229   yes
      2  0.321438   yes
      3  0.434531   yes
      4  0.434531    no

Dosya açma, kodlama ve sıkıştırma

mode parametresi, oluşturduğunuz dosyayla aynı ada sahip bir CSV dosyanız zaten olduğunda ne yapılacağını belirlemenizi sağlar. Parametreyi ‘w’ olarak ayarlar ve zaten bir new_titanic.csv dosyanız varsa, oluşturduğunuz yeni dosya eskisinin yerini alır. ‘x’ olarak ayarlarsanız, yeni dosya yalnızca aynı ada sahip mevcut bir dosya yoksa oluşturulur. Son olarak, parametreyi ‘a’ olarak ayarlarsanız, yeni dosya aynı adlı eski dosyaya eklenir (belki yalnızca birkaç satır eklemek istiyorsunuzdur).

Kodlama (encoding) parametresi yeni dosyanın kodlamasını ayarlar. Verileriniz başka alfabelerin harfleri gibi özel karakterler içeriyorsa, bunu ‘utf-8’ ya da başka bir kodlama olarak ayarlayabilirsiniz.

compression parametresi yeni dosyanın nasıl sıkıştırılacağını belirler. Varsayılan olarak ‘infer’ şeklindedir; bu, sıkıştırma türünün belirtilen uzantıya göre belirleneceği anlamına gelir; ancak tercih ettiğiniz uzantıyı da belirtebilirsiniz.

# Infer the compression
new_df.to_csv('new_titanic.csv.gz')
# Specify the compression explicitly
new_df.to_csv('new_data.csv.gz', compression='gzip')
# Specify the compression via a dictionary
new_df.to_csv(
    'new_data.zip', 
    compression={
        'method': 'zip', 
        'archive_name': 'data.csv'
    }
)

Tırnaklama (quoting) nasıl kullanılır

quoting parametresi, hangi tür verilerin tırnak içine alınacağını ayarlar. Daha önce belirttiğim gibi, ayırıcı olarak virgül kullanırken ve hücreler de (metin gibi) virgül içeriyorsa, hangilerinin tırnak içine alınacağını belirlemeniz gerekir.

# Default value, quotes only fields with special characters or separators like tabs and commas
new_df.to_csv('new_titanic.csv', quoting=csv.QUOTE_MINIMAL)
# Quotes all fields
new_df.to_csv('new_titanic.csv', quoting=csv.QUOTE_ALL)
# Quotes only fields with non-numeric values
new_df.to_csv('new_titanic.csv', quoting=csv.QUOTE_NONNUMERIC)
# No field is quoted
new_df.to_csv('new_titanic.csv', quoting=csv.QUOTE_NONE)

Chunksize ve tarih-saat verileri

chunksize parametresi, dosyanızın bir seferde ne kadarının yazılacağını belirtir. Varsayılan değeri bıraktığınızda tüm satırlar bir seferde yazılır; ancak dosya çok büyük olduğunda kullanışlı olabilecek bir sayı belirtebilirsiniz.

date_format parametresi, datetime nesnelerinin gösterimini ayarlar. Bunu strftime formatını kullanarak belirtebilirsiniz.

# Write DataFrame to CSV with dates formatted as 'MM/DD/YYYY'
new_df.to_csv('new_titanic.csv', date_format='%m/%d/%Y')
# You can set datetime objects up to seconds
new_df.to_csv('new_titanic.csv', date_format='%Y-%m-%d %H:%M:%S')

Sonuç

Umarım artık DataFrame'inizi ihtiyaçlarınıza uygun formatta dışa aktarmaya hazırsınızdır!

Öğrenmeye devam etmenizi öneririm—işte deneyebileceğiniz bazı kaynaklar:

Tudor Mărginean

Yazar

Tudor Mărginean

Romanya, Bükreş Üniversitesi'nde veri bilimi yüksek lisansımı bitiriyorum; tez konum, Grafik Sinir Ağlarına dayalı çeşitli modeller kullanarak trafik akışı tahmini. Edindiğim başlıca beceriler Python ve Power BI ile veri temizleme ve görselleştirme, çeşitli makine öğrenimi görevleri için ön işleme ve PyTorch (veya TensorFlow) ile model oluşturma oldu. Aynı zamanda felsefe alanında doktora öğrencisi olarak birinci mertebe mantık üzerine seminerler veriyor ve Bayesyen doğrulama kuramı üzerine tezimi yazıyorum. Veriler ve model kurma hakkında daha fazla şey öğrenmeye ve öğrendiklerimi öğretmeye hevesliyim.

Konular

İlgili