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 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.
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:
df.to_csv('my_csv.csv', mode='a', header=False)
Le mode par défaut est «w».
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:
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
with open(filename, 'a') as f:
df.to_csv(f, header=f.tell()==0)
mode='a'
paramètre comme to_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:
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)
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
@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)`