2013-07-08 9 views
84

Chcę wiedzieć, czy można użyć funkcji pandy to_csv(), aby dodać ramkę danych do istniejącego pliku csv. Plik csv ma ​​taką samą strukturę jak załadowane dane.Jak dodać dane pand do istniejącego pliku csv?

+6

myślę metoda zaproponowana przez @tlingf jest lepszy tylko dlatego jest on za pomocą Build- w funkcjonalności biblioteki pand. Sugeruje zdefiniowanie trybu jako "a". "A" oznacza APPEND "df.to_csv (" my_csv.csv ", tryb =" a ", nagłówek = fałsz)" – Ayrat

Odpowiedz

119

Można dołączyć do csv przez opening the file w trybie dopisywania:

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

Jeśli to był twój CSV, foo.csv:

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

Jeśli czytasz to i następnie dodać, na przykład , 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 staje:

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

Dziękuję @Andy Hayden – Samatix

+0

może dodać to do książki kucharskiej? – Jeff

+0

@Jeff oop podobno [ten jeden] (http://stackoverflow.com/questions/17134942/pandas-dataframe-output-end-of-csv) jest [już tam jest] (http://pandas.pydata.org/ pandas-docs/dev/cookbook.html # csv) (wiedziałem, że odpowiedziałem na to wcześniej!) Mam zamiar zrobić to w inny sposób ...: s –

203

Można określić tryb python pisać w pand to_csv funkcję. Dla dołączenia jest to "a".

W twoim przypadku:

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

Domyślny tryb jest 'w'.

14

Trochę funkcja pomocnika korzystać z jakimś nagłówku sprawdzanie zabezpieczeń to wszystko obsłużyć:

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

Trochę późno do partii, ale można też użyć menedżera kontekstowe, jeśli otwieranie i zamykanie złożyć kilka razy, lub dane logowania, statystyki itd

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)` 
0

Początkowo wychodząc z dataframes pyspark - mam błędy typu konwersji (przy konwersji do pandy df, a następnie dodanie do csv) Biorąc pod uwagę typy schematu/kolumn w moje ramki danych dla pyspark

rozwiązał ten problem poprzez zmuszanie wszystkich kolumn w każdym df się od typu string, a następnie dodanie do pliku CSV to następująco:

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