Bagaimana cara menambahkan data panda ke file csv yang ada?

259

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.

Ayoub Ennassiri
sumber
6
Saya pikir metode yang disarankan oleh @tlingf lebih baik hanya karena dia menggunakan fungsi built-in panda library. Dia menyarankan mendefinisikan mode sebagai "a". "A" adalah singkatan dari APPEND 'df.to_csv (' my_csv.csv ', mode =' a ', header = False)'
Ayrat
1
Jawaban dari @KCzar mempertimbangkan kedua kasus ketika file CSV tidak ada (yaitu menambahkan header kolom) dan ketika CSV sudah ada di sana (jadi tambahkan hanya baris data tanpa header). Dalam kasus apa pun ia menggunakan mode "tambahkan" dan pemisah kustom, bersama dengan pemeriksaan pada jumlah kolom.
TPPZ

Jawaban:

544

Anda dapat menentukan mode tulis python dalam to_csvfungsi panda . Untuk menambahkannya adalah 'a'.

Dalam kasus Anda:

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

Mode standar adalah 'w'.

tlingf
sumber
7
Terima kasih atas jawabannya. Ini akan memungkinkan saya menambahkan df baru pada baris-bijaksana. Tapi bisakah Anda memberi tahu saya bagaimana saya dapat menambahkan df baru pada kolom-bijaksana?
datanew
Saya dapat mencapainya dengan membaca kembali 'my_csv.csv', kemudian melakukan concat df baru, dan kemudian menyimpannya. Jika Anda tahu beberapa metode yang lebih mudah, silakan LAKUKAN. Saya menghargai!
datanew
2
Bagaimana cara menulis tajuk untuk file pertama dan baris lainnya ditambahkan secara otomatis?
Etisha
4
@Etisha sesuatu sepertidf.to_csv(output_path, mode='a', header=not os.path.exists(output_path))
Michele Tonutti
255

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
Andy Hayden
sumber
50
with open(filename, 'a') as f:
    df.to_csv(f, header=f.tell()==0)
  • Buat file kecuali ada, jika tidak tambahkan
  • Tambahkan tajuk jika file sedang dibuat, jika tidak lewati saja
DeveScie
sumber
2
Tidak ada mode='a'sebagai parameter untuk to_csv(yaitudf.to_csv(f, mode='a', header=f.tell()==0)
Gabriela Melo
2
@GabrielaMelo Yang disahkan dalam fungsi terbuka (nama file, 'a').
Piyush
21

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)
KCzar
sumber
1
Apa yang bisa kita lakukan jika urutan kolom tidak cocok?
Jason Goal
@JasonGoal df = df.reindex (diurutkan (df.columns), sumbu = 1); lihat stackoverflow.com/a/11067072/9095840 .
markemus
4

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)
Grant Shannon
sumber
3

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)`
ai-shwarya
sumber