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.
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
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'.
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)
with open(filename, 'a') as f:
df.to_csv(f, header=f.tell()==0)
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)`
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)