Хочу знати, чи можна використовувати функцію pandas to_csv()
для додавання фрейму даних до існуючого файлу csv. Файл csv має таку ж структуру, що і завантажені дані.
Хочу знати, чи можна використовувати функцію pandas to_csv()
для додавання фрейму даних до існуючого файлу csv. Файл csv має таку ж структуру, що і завантажені дані.
Відповіді:
Ви можете вказати режим запису python у функції pandas to_csv
. Для додавання це "a".
У вашому випадку:
df.to_csv('my_csv.csv', mode='a', header=False)
Режим за замовчуванням - 'w'.
df.to_csv(output_path, mode='a', header=not os.path.exists(output_path))
Ви можете додати файл 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
with open(filename, 'a') as f:
df.to_csv(f, header=f.tell()==0)
mode='a'
як параметр відсутній to_csv
(тобтоdf.to_csv(f, mode='a', header=f.tell()==0)
Невелика допоміжна функція, яку я використовую з деякими захисними засобами, що перевіряють заголовок:
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)
Спочатку починаючи з фреймів даних pyspark - у мене виникли помилки перетворення типу (при перетворенні в df-файли панд, а потім до додавання до CSV) з урахуванням типів схеми / стовпців у моїх фреймах даних pyspark
Вирішили проблему, змусивши всі стовпці в кожному df бути рядком типу, а потім додавши це до CSV наступним чином:
with open('testAppend.csv', 'a') as f:
df2.toPandas().astype(str).to_csv(f, header=False)
Трохи запізнюємось на вечірку, але ви також можете скористатись контекстним менеджером, якщо ви відкриваєте та закриваєте свій файл кілька разів, або реєструєте дані, статистику тощо.
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)`