Varolan bir csv dosyasına panda verileri nasıl eklenir?


260

to_csv()Varolan bir csv dosyasına bir veri çerçevesi eklemek için pandalar işlevini kullanmak mümkün olup olmadığını bilmek istiyorum . Csv dosyası, yüklenen verilerle aynı yapıya sahiptir.


6
@Tlingf tarafından önerilen yöntemin sadece panda kütüphanesinin yerleşik işlevlerini kullanması nedeniyle daha iyi olduğunu düşünüyorum. Modun "a" olarak tanımlanmasını önerir. "A", APPEND 'df.to_csv (' my_csv.csv ', mode =' a ', başlık = Yanlış)' anlamına gelir
Ayrat

1
@KCzar'ın yanıtı, her iki durumda da CSV dosyası olmadığında (yani sütun başlığını ekleyin) ve CSV zaten orada olduğunda (bu nedenle yalnızca üstbilgisiz veri satırlarını ekleyin) dikkate alır. Her durumda, "ekleme" modunu ve özel bir ayırıcıyı ve sütun sayısını kontrol eder.
TPPZ

Yanıtlar:


546

Panda to_csvişlevinde bir python yazma modu belirleyebilirsiniz . Eklemek için 'a'.

Senin durumunda:

df.to_csv('my_csv.csv', mode='a', header=False)

Varsayılan mod 'w'dir.


7
Cevap için teşekkürler. Bu satır başı yeni df eklememe izin verecektir. Ama yeni df'yi sütun bazında nasıl ekleyebilirim?
datanew

'My_csv.csv' dosyasını yeniden okuyarak, ardından yeni df'yi kapatıp kaydederek başardım. Daha kolay bir yöntem biliyorsanız, lütfen bana bildirin. Takdir ediyorum!
datanew

3
İlk dosya ve satırların geri kalanı için başlık nasıl otomatik olarak eklenir?
Etisha

7
@Etisha gibi bir şeydf.to_csv(output_path, mode='a', header=not os.path.exists(output_path))
Michele Tonutti

255

Şunları yapabilirsiniz eklemek tarafından bir csv dosyası açılırken modu ekleme:

with open('my_csv.csv', 'a') as f:
    df.to_csv(f, header=False)

Bu sizin CSV'niz olsaydı foo.csv:

,A,B,C
0,1,2,3
1,4,5,6

Bunu okuyup eklerseniz örneğin df + 6:

In [1]: df = pd.read_csv('foo.csv', index_col=0)

In [2]: df
Out[2]:
   A  B  C
0  1  2  3
1  4  5  6

In [3]: df + 6
Out[3]:
    A   B   C
0   7   8   9
1  10  11  12

In [4]: with open('foo.csv', 'a') as f:
             (df + 6).to_csv(f, header=False)

foo.csv dönüşür:

,A,B,C
0,1,2,3
1,4,5,6
0,7,8,9
1,10,11,12

52
with open(filename, 'a') as f:
    df.to_csv(f, header=f.tell()==0)
  • Var olmadığı sürece dosya oluştur, yoksa ekle
  • Dosya oluşturuluyorsa üstbilgi ekleyin, aksi takdirde atlayın

2
mode='a'Bir parametre olarak eksik to_csv(yanidf.to_csv(f, mode='a', header=f.tell()==0)
Gabriela Melo

2
@GabrielaMelo Bu açık fonksiyonda geçti (dosya adı, 'a').
Piyush

21

Her şeyle başa çıkmak için bazı başlık kontrol önlemleriyle birlikte kullandığım küçük bir yardımcı işlev:

def appendDFToCSV_void(df, csvFilePath, sep=","):
    import os
    if not os.path.isfile(csvFilePath):
        df.to_csv(csvFilePath, mode='a', index=False, sep=sep)
    elif len(df.columns) != len(pd.read_csv(csvFilePath, nrows=1, sep=sep).columns):
        raise Exception("Columns do not match!! Dataframe has " + str(len(df.columns)) + " columns. CSV file has " + str(len(pd.read_csv(csvFilePath, nrows=1, sep=sep).columns)) + " columns.")
    elif not (df.columns == pd.read_csv(csvFilePath, nrows=1, sep=sep).columns).all():
        raise Exception("Columns and column order of dataframe and csv file do not match!!")
    else:
        df.to_csv(csvFilePath, mode='a', index=False, sep=sep, header=False)

1
Sütun sırası eşleşmezse ne yapabiliriz?
Jason Goal

@JasonGoal df = df.reindex (sıralı (df.columns), eksen = 1); bkz. stackoverflow.com/a/11067072/9095840 .
markemus

4

Başlangıçta bir pyspark veri çerçeveleri ile başlayan - benim pyspark veri çerçeveleri şema / sütun türleri göz önüne alındığında (panda df's dönüştürmek ve sonra csv eklerken) tür dönüştürme hataları var

Her df'deki tüm sütunları tür dizesi olmaya zorlayarak ve ardından csv'ye aşağıdaki gibi ekleyerek sorunu çözdü:

with open('testAppend.csv', 'a') as f:
    df2.toPandas().astype(str).to_csv(f, header=False)

3

Partiye biraz geç kaldın, ancak dosyanızı birden çok kez açıp kapatıyorsanız veya veri, istatistik vb. Kaydediyorsanız bir bağlam yöneticisi de kullanabilirsiniz.

from contextlib import contextmanager
import pandas as pd
@contextmanager
def open_file(path, mode):
     file_to=open(path,mode)
     yield file_to
     file_to.close()


##later
saved_df=pd.DataFrame(data)
with open_file('yourcsv.csv','r') as infile:
      saved_df.to_csv('yourcsv.csv',mode='a',header=False)`
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.