¿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.

Ayoub Ennassiri
fuente
66
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'.

En tu caso:

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

El modo predeterminado es 'w'.

tlingf
fuente
77
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?
Etisha
55
@Etisha algo asídf.to_csv(output_path, mode='a', header=not os.path.exists(output_path))
Michele Tonutti
255

Puede agregar a un csv abriendo el archivo en modo agregar:

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,3
1,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
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 se convierte en:

,A,B,C
0,1,2,3
1,4,5,6
0,7,8,9
1,10,11,12
Andy Hayden
fuente
51
with open(filename, 'a') as f:
    df.to_csv(f, header=f.tell()==0)
  • Crear archivo a menos que exista, de lo contrario agregar
  • Agregue encabezado si se está creando el archivo; de lo contrario, omítalo
DeveScie
fuente
2
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
    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
fuente
1
¿Qué podríamos hacer si el orden de las columnas no coincide?
Jason Goal
@JasonGoal df = df.reindex (ordenado (df.columns), axis = 1); ver stackoverflow.com/a/11067072/9095840 .
markemus
4

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)
Grant Shannon
fuente
3

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
@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
fuente