¿Cómo agregar datos de pandas a un archivo csv existente?
259
Quiero saber si es posible usar la to_csv()función pandas para agregar un marco de datos a un archivo csv existente. El archivo csv tiene la misma estructura que los datos cargados.
Creo que el método sugerido por @tlingf es mejor solo porque está utilizando la funcionalidad integrada de la biblioteca de pandas. Sugiere definir el modo como "a". "A" significa APÉNDICE 'df.to_csv (' my_csv.csv ', mode =' a ', header = False)'
Ayrat
1
La respuesta de @KCzar considera tanto los casos en que el archivo CSV no está allí (es decir, agregue el encabezado de columna) como cuando el CSV ya está allí (agregue solo las filas de datos sin encabezados). En cualquier caso, utiliza el modo "agregar" y un separador personalizado, junto con comprobaciones sobre el número de columnas.
TPPZ
Respuestas:
544
Puede especificar un modo de escritura python en la to_csvfunción pandas . Para anexar es 'a'.
Gracias por la respuesta. Esto me permitirá agregar un nuevo df en fila. Pero, ¿podría decirme cómo puedo agregar el nuevo df en columnas?
nuevos el
Pude lograrlo volviendo a leer 'my_csv.csv', luego concaté el nuevo df y luego lo guardé. Si conoce algún método más fácil, hágamelo saber. ¡Yo aprecio!
nuevos
2
¿Cómo se escribe automáticamente el encabezado para el primer archivo y el resto de las filas?
with open('my_csv.csv','a')as f:
df.to_csv(f, header=False)
Si este fue su csv foo.csv:
,A,B,C
0,1,2,31,4,5,6
Si lee eso y luego agrega, por ejemplo df + 6:
In[1]: df = pd.read_csv('foo.csv', index_col=0)In[2]: df
Out[2]:
A B C
01231456In[3]: df +6Out[3]:
A B C
07891101112In[4]:with open('foo.csv','a')as f:(df +6).to_csv(f, header=False)
Falta un mode='a'como parámetro para to_csv(es decirdf.to_csv(f, mode='a', header=f.tell()==0)
Gabriela Melo
2
@GabrielaMelo Eso se pasó en la función abierta (nombre de archivo, 'a').
Piyush
21
Una pequeña función auxiliar que uso con algunas garantías de comprobación de encabezado para manejarlo todo:
def appendDFToCSV_void(df, csvFilePath, sep=","):import os
ifnot 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):raiseException("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.")elifnot(df.columns == pd.read_csv(csvFilePath, nrows=1, sep=sep).columns).all():raiseException("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)
Inicialmente comenzando con un marco de datos pyspark: obtuve errores de conversión de tipo (al convertir a pandas df y luego agregar a csv) dados los tipos de esquema / columna en mis marcos de datos pyspark
Resolvió el problema forzando a todas las columnas en cada df a ser de tipo cadena y luego agregando esto a csv de la siguiente manera:
with open('testAppend.csv','a')as f:
df2.toPandas().astype(str).to_csv(f, header=False)
Un poco tarde para la fiesta, pero también puede usar un administrador de contexto, si está abriendo y cerrando su archivo varias veces, o registrando datos, estadísticas, etc.
from contextlib import contextmanager
import pandas as pd
@contextmanagerdef 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)`
Respuestas:
Puede especificar un modo de escritura python en la
to_csv
función pandas . Para anexar es 'a'.En tu caso:
El modo predeterminado es 'w'.
fuente
df.to_csv(output_path, mode='a', header=not os.path.exists(output_path))
Puede agregar a un csv abriendo el archivo en modo agregar:
Si este fue su csv
foo.csv
:Si lee eso y luego agrega, por ejemplo
df + 6
:foo.csv
se convierte en:fuente
fuente
mode='a'
como parámetro parato_csv
(es decirdf.to_csv(f, mode='a', header=f.tell()==0)
Una pequeña función auxiliar que uso con algunas garantías de comprobación de encabezado para manejarlo todo:
fuente
Inicialmente comenzando con un marco de datos pyspark: obtuve errores de conversión de tipo (al convertir a pandas df y luego agregar a csv) dados los tipos de esquema / columna en mis marcos de datos pyspark
Resolvió el problema forzando a todas las columnas en cada df a ser de tipo cadena y luego agregando esto a csv de la siguiente manera:
fuente
Un poco tarde para la fiesta, pero también puede usar un administrador de contexto, si está abriendo y cerrando su archivo varias veces, o registrando datos, estadísticas, etc.
fuente