Comment ajouter des données pandas à un fichier csv existant?

259

Je veux savoir s'il est possible d'utiliser la to_csv()fonction pandas pour ajouter une trame de données à un fichier csv existant. Le fichier csv a la même structure que les données chargées.

Ayoub Ennassiri
la source
6
Je pense que la méthode suggérée par @tlingf n'est meilleure que parce qu'il utilise la fonctionnalité intégrée de la bibliothèque pandas. Il suggère de définir le mode comme "a". "A" signifie APPEND 'df.to_csv (' my_csv.csv ', mode =' a ', header = False)'
Ayrat
1
La réponse de @KCzar prend en compte à la fois les cas où le fichier CSV n'est pas là (c'est-à-dire ajoutez l'en-tête de colonne) et quand le CSV est déjà là (alors ajoutez simplement les lignes de données sans en-têtes). Dans tous les cas, il utilise le mode "ajouter" et un séparateur personnalisé, ainsi que des vérifications sur le nombre de colonnes.
TPPZ

Réponses:

544

Vous pouvez spécifier un mode d'écriture python dans la to_csvfonction pandas . Pour ajouter, c'est «a».

Dans ton cas:

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

Le mode par défaut est «w».

tlingf
la source
7
Merci d'avoir répondu. Cela me permettra d'ajouter de nouveaux df en ligne. Mais pourriez-vous me faire savoir comment puis-je ajouter le nouveau df sur colonne?
datanew
J'ai pu l'accomplir en relisant le «my_csv.csv», puis en concaténant le nouveau df, puis en l'enregistrant. Si vous connaissez une méthode plus simple, veuillez me le faire savoir. J'apprécie!
datanew
2
Comment écrire un en-tête pour le premier fichier et le reste des lignes y est automatiquement ajouté?
Etisha
5
@Etisha quelque chose commedf.to_csv(output_path, mode='a', header=not os.path.exists(output_path))
Michele Tonutti
255

Vous pouvez ajouter à un csv en ouvrant le fichier en mode ajout:

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

Si tel était votre csv, foo.csv:

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

Si vous avez bien lu et append, par exemple, 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 devient:

,A,B,C
0,1,2,3
1,4,5,6
0,7,8,9
1,10,11,12
Andy Hayden
la source
51
with open(filename, 'a') as f:
    df.to_csv(f, header=f.tell()==0)
  • Créer un fichier sauf s'il existe, sinon ajouter
  • Ajoutez un en-tête si le fichier est en cours de création, sinon sautez-le
DeveScie
la source
2
Il manque un mode='a'paramètre comme to_csv(par exempledf.to_csv(f, mode='a', header=f.tell()==0)
Gabriela Melo
2
@GabrielaMelo Cela a été transmis dans la fonction open (nom de fichier, 'a').
Piyush
21

Une petite fonction d'aide que j'utilise avec des sauvegardes de vérification d'en-tête pour tout gérer:

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
la source
1
Que pourrions-nous faire si l'ordre des colonnes ne correspond pas?
Jason Goal
@JasonGoal df = df.reindex (trié (df.columns), axe = 1); voir stackoverflow.com/a/11067072/9095840 .
markemus
4

Commençant initialement par un dataframes pyspark - j'ai eu des erreurs de conversion de type (lors de la conversion en pandas df's puis de l'ajout en csv) étant donné les types de schéma / colonne dans mes dataframes pyspark

Résolution du problème en forçant toutes les colonnes de chaque df à être de type chaîne, puis en ajoutant ceci à csv comme suit:

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

Un peu tard pour la fête, mais vous pouvez également utiliser un gestionnaire de contexte, si vous ouvrez et fermez votre fichier plusieurs fois, ou enregistrez des données, des statistiques, 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
la source