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.
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».
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é?
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,31,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
01231456In[3]: df +6Out[3]:
A B C
07891101112In[4]:with open('foo.csv','a')as f:(df +6).to_csv(f, header=False)
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
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)
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)
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
@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)`
Réponses:
Vous pouvez spécifier un mode d'écriture python dans la
to_csv
fonction pandas . Pour ajouter, c'est «a».Dans ton cas:
Le mode par défaut est «w».
la source
df.to_csv(output_path, mode='a', header=not os.path.exists(output_path))
Vous pouvez ajouter à un csv en ouvrant le fichier en mode ajout:
Si tel était votre csv,
foo.csv
:Si vous avez bien lu et append, par exemple,
df + 6
:foo.csv
devient:la source
la source
mode='a'
paramètre commeto_csv
(par exempledf.to_csv(f, mode='a', header=f.tell()==0)
Une petite fonction d'aide que j'utilise avec des sauvegardes de vérification d'en-tête pour tout gérer:
la source
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:
la source
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.
la source