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


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


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

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

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)

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)

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)`
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.