Як додати дані панд до наявного файлу CSV?


259

Хочу знати, чи можна використовувати функцію pandas to_csv()для додавання фрейму даних до існуючого файлу csv. Файл csv має таку ж структуру, що і завантажені дані.


6
Я думаю, що метод, запропонований @tlingf, кращий лише тому, що він використовує вбудовану функціональність бібліотеки панд. Він пропонує визначити режим як "a". "A" означає APPEND 'df.to_csv (' my_csv.csv ', mode =' a ', header = Неправильно)'
Айрат

1
Відповідь від @KCzar розглядає як випадки, коли файлу CSV немає (тобто додайте заголовок стовпця), так і коли CSV вже є (тому додайте лише рядки даних без заголовків). У будь-якому випадку він використовує режим "додавання" та спеціальний роздільник, а також перевіряє кількість стовпців.
TPPZ

Відповіді:


542

Ви можете вказати режим запису python у функції pandas to_csv. Для додавання це "a".

У вашому випадку:

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

Режим за замовчуванням - 'w'.


7
Дякую за відповідь. Це дозволить мені додати новий df на строкових строках. Але чи можете ви дозволити мені знати, як я можу додати новий df на колонку?
datanew

Я зміг досягти цього, перечитавши "my_csv.csv", а потім сформулюйте новий df, а потім збережіть його. Якщо ви знаєте якийсь простіший метод, будь ласка, повідомте мене. Я ціную!
datanew

2
Як написати заголовок для першого файлу, а решта рядків автоматично додається до нього?
Етіша

4
@Etisha щось на кшталтdf.to_csv(output_path, mode='a', header=not os.path.exists(output_path))
Мішель

255

Ви можете додати файл csv, відкривши файл у режимі додавання:

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

Якщо це ваш CSV - файл, foo.csv:

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

Якщо ви читаєте це, а потім додаєте, наприклад 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 стає:

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

50
with open(filename, 'a') as f:
    df.to_csv(f, header=f.tell()==0)
  • Створіть файл, якщо не існує, інакше додайте
  • Додати файл заголовка, якщо файл створюється, інакше пропустіть його

2
Він mode='a'як параметр відсутній to_csv(тобтоdf.to_csv(f, mode='a', header=f.tell()==0)
Габріела Мело

2
@GabrielaMelo Це було передано у функції open (ім'я файлу, 'a').
Піюш

21

Невелика допоміжна функція, яку я використовую з деякими захисними засобами, що перевіряють заголовок:

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
Що ми могли б зробити, якщо порядок стовпців не збігається?
Гол Джейсона

@JasonGoal df = df.reindex (відсортовано (df.колонки), вісь = 1); див. stackoverflow.com/a/11067072/9095840 .
markemus

4

Спочатку починаючи з фреймів даних pyspark - у мене виникли помилки перетворення типу (при перетворенні в df-файли панд, а потім до додавання до CSV) з урахуванням типів схеми / стовпців у моїх фреймах даних pyspark

Вирішили проблему, змусивши всі стовпці в кожному df бути рядком типу, а потім додавши це до CSV наступним чином:

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

3

Трохи запізнюємось на вечірку, але ви також можете скористатись контекстним менеджером, якщо ви відкриваєте та закриваєте свій файл кілька разів, або реєструєте дані, статистику тощо.

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)`
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.