Jak dodać dane pand do istniejącego pliku csv?

259

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

Ayoub Ennassiri
źródło
6
Myślę, że metoda sugerowana przez @tlingf jest lepsza tylko dlatego, że korzysta z wbudowanej funkcjonalności biblioteki pand. Sugeruje zdefiniowanie trybu jako „a”. „A” oznacza APPEND ”df.to_csv („ my_csv.csv ”, mode =„ a ”, header = False)”
Ayrat,
1
Odpowiedź @KCzar uwzględnia zarówno przypadki, w których nie ma pliku CSV (tj. Dodaj nagłówek kolumny), jak i gdy plik CSV już tam jest (więc dodaj tylko wiersze danych bez nagłówków). W każdym razie używa trybu „dołącz” i niestandardowego separatora, a także sprawdza liczbę kolumn.
TPPZ

Odpowiedzi:

542

Możesz określić tryb zapisu python w to_csvfunkcji pandy . W przypadku dołączania jest to „a”.

W Twoim przypadku:

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

Domyślnym trybem jest „w”.

tlingf
źródło
7
Dziękuję za odpowiedź. Pozwoli mi to dodać nowy plik df w wierszu. Ale czy możesz dać mi znać, jak mogę dołączyć nowy plik df w kolumnie?
datanew
Udało mi się to zrobić, ponownie czytając plik „my_csv.csv”, a następnie skonkatować nowy plik df, a następnie zapisać go. Jeśli znasz jakąś łatwiejszą metodę, daj mi znać. Doceniam!
datanew
2
Jak napisać nagłówek dla pierwszego pliku, a reszta wierszy zostanie do niego automatycznie dołączona?
Etisha
4
@Etisha coś w styludf.to_csv(output_path, mode='a', header=not os.path.exists(output_path))
Michele Tonutti
255

Możesz dołączyć do pliku CSV, otwierając plik w trybie dołączania:

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

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

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

Jeśli to czytasz, a następnie dołącz, 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 się:

,A,B,C
0,1,2,3
1,4,5,6
0,7,8,9
1,10,11,12
Andy Hayden
źródło
50
with open(filename, 'a') as f:
    df.to_csv(f, header=f.tell()==0)
  • Utwórz plik, jeśli nie istnieje, w przeciwnym razie dołącz
  • Dodaj nagłówek, jeśli plik jest tworzony, w przeciwnym razie pomiń go
DeveScie
źródło
2
Brakuje mode='a'jako parametru do to_csv(tj.df.to_csv(f, mode='a', header=f.tell()==0)
Gabriela Melo
2
@GabrielaMelo To zostało przekazane w funkcji open (nazwa pliku, „a”).
Piyush
21

Mała funkcja pomocnika, której używam z pewnymi zabezpieczeniami sprawdzania nagłówka, aby obsłużyć to wszystko:

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)
KCzar
źródło
1
Co możemy zrobić, jeśli kolejność kolumn nie pasuje?
Jason Gol
@JasonGoal df = df.reindex (posortowane (df.kolumny), oś = 1); patrz stackoverflow.com/a/11067072/9095840 .
markemus
4

Początkowo zaczynając od ramek danych pyspark - dostałem błędy konwersji typu (podczas konwersji do pandas df, a następnie dołączenia do csv), biorąc pod uwagę typy schematu / kolumny w moich ramkach danych pyspark

Rozwiązano problem, zmuszając wszystkie kolumny w każdym pliku df do typu ciąg, a następnie dołączając to do pliku csv w następujący sposób:

with open('testAppend.csv', 'a') as f:
    df2.toPandas().astype(str).to_csv(f, header=False)
Grant Shannon
źródło
3

Trochę późno na imprezę, ale możesz również użyć menedżera kontekstu, jeśli otwierasz i zamykasz plik wiele razy lub logujesz dane, statystyki itp.

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)`
ai-shwarya
źródło