web-dev-qa-db-fra.com

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

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

180
Samatix

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

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

S'il s'agissait de votre csv, foo.csv:

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

Si vous lisez et ajoutez ensuite, 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
225
Andy Hayden

Vous pouvez spécifier un mode d'écriture python dans la fonction pandas to_csv . Pour append c'est 'a'.

Dans ton cas:

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

Le mode par défaut est 'w'.

407
tlingf

Une petite fonction d'aide que j'utilise avec quelques sauvegardes de contrôle 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)
18
KCzar
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 créé, sinon sautez-le
15
DeveScie

Un peu tard pour le parti 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)`
3
ai-shwarya

Initialement en commençant avec un pyspark dataframes - J'ai eu des erreurs de conversion de type (lors de la conversion en pandas df's puis en ajoutant au format csv) en fonction des types de schéma/colonne de mes pyspark dataframes

Résolu le 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)
2
Grant Shannon