Saya ingin tahu apakah mungkin menggunakan to_csv()
fungsi panda untuk menambahkan dataframe ke file csv yang ada. File csv memiliki struktur yang sama dengan data yang dimuat.
Saya ingin tahu apakah mungkin menggunakan to_csv()
fungsi panda untuk menambahkan dataframe ke file csv yang ada. File csv memiliki struktur yang sama dengan data yang dimuat.
Jawaban:
Anda dapat menentukan mode tulis python dalam to_csv
fungsi panda . Untuk menambahkannya adalah 'a'.
Dalam kasus Anda:
df.to_csv('my_csv.csv', mode='a', header=False)
Mode standar adalah 'w'.
df.to_csv(output_path, mode='a', header=not os.path.exists(output_path))
Anda dapat menambahkan ke csv dengan membuka file dalam mode append:
with open('my_csv.csv', 'a') as f:
df.to_csv(f, header=False)
Jika ini adalah csv Anda, foo.csv
:
,A,B,C
0,1,2,3
1,4,5,6
Jika Anda membaca itu dan kemudian append, misalnya, 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
menjadi:
,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'
sebagai parameter untuk to_csv
(yaitudf.to_csv(f, mode='a', header=f.tell()==0)
Sebuah fungsi pembantu kecil yang saya gunakan dengan beberapa pengamanan header untuk menangani semuanya:
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)
Awalnya dimulai dengan kerangka data pyspark - Saya mendapat kesalahan konversi jenis (saat mengonversi ke panda df dan kemudian menambahkan ke csv) mengingat skema / kolom jenis dalam kerangka data pyspark saya
Memecahkan masalah dengan memaksa semua kolom di setiap df menjadi tipe string dan kemudian menambahkan ini ke csv sebagai berikut:
with open('testAppend.csv', 'a') as f:
df2.toPandas().astype(str).to_csv(f, header=False)
Agak terlambat ke pesta tetapi Anda juga dapat menggunakan manajer konteks, jika Anda membuka dan menutup file Anda beberapa kali, atau mencatat data, statistik, dll.
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)`