Làm cách nào để thêm dữ liệu gấu trúc vào tệp csv hiện có?


259

Tôi muốn biết liệu có thể sử dụng to_csv()hàm pandas để thêm một khung dữ liệu vào tệp csv hiện có hay không. Tệp csv có cấu trúc giống như dữ liệu được tải.


6
Tôi nghĩ rằng phương pháp được đề xuất bởi @tlingf chỉ tốt hơn bởi vì anh ta đang sử dụng chức năng tích hợp của thư viện gấu trúc. Ông đề nghị xác định chế độ là "a". "A" là viết tắt của APPEND 'df.to_csv (' my_csv.csv ', mode =' a ', tiêu đề = Sai)'
Ayrat

1
Câu trả lời từ @KCzar xem xét cả hai trường hợp khi tệp CSV không có ở đó (tức là thêm tiêu đề cột) và khi CSV đã ở đó (vì vậy chỉ thêm các hàng dữ liệu không có tiêu đề). Trong mọi trường hợp, nó sử dụng chế độ "chắp thêm" và dấu phân cách tùy chỉnh, cùng với kiểm tra số lượng cột.
TPPZ

Câu trả lời:


544

Bạn có thể chỉ định chế độ ghi python trong to_csvchức năng gấu trúc . Để nối thêm nó là 'a'.

Trong trường hợp của bạn:

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

Chế độ mặc định là 'w'.


7
Cảm ơn câu trả lời. Điều này sẽ cho phép tôi nối df mới trên hàng-khôn ngoan. Nhưng bạn có thể cho tôi biết làm thế nào tôi có thể nối thêm df mới trên cột không?
datanew

Tôi đã có thể hoàn thành nó bằng cách đọc lại 'my_csv.csv', sau đó nối df mới, và sau đó lưu nó. Nếu bạn biết một số phương pháp dễ dàng hơn, xin vui lòng cho tôi biết. Tôi đánh giá cao!
datanew

2
Làm thế nào để viết tiêu đề cho tệp đầu tiên và phần còn lại của các hàng sẽ tự động được thêm vào nó?
Etisha

4
@Etisha đại loại nhưdf.to_csv(output_path, mode='a', header=not os.path.exists(output_path))
Michele Tonutti

255

Bạn có thể chắp thêm vào một csv bằng cách mở tệp ở chế độ chắp thêm:

with open('my_csv.csv', 'a') as f:
    df.to_csv(f, header=False)

Nếu đây là csv của bạn , foo.csv:

,A,B,C
0,1,2,3
1,4,5,6

Nếu bạn đọc nó và sau đó nối thêm, ví dụ 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 trở thành:

,A,B,C
0,1,2,3
1,4,5,6
0,7,8,9
1,10,11,12

50
with open(filename, 'a') as f:
    df.to_csv(f, header=f.tell()==0)
  • Tạo tập tin trừ khi tồn tại, nếu không thì nối thêm
  • Thêm tiêu đề nếu tập tin đang được tạo, nếu không hãy bỏ qua nó

2
Nó thiếu một mode='a'tham số cho to_csv(ví dụdf.to_csv(f, mode='a', header=f.tell()==0)
Gabriela Melo

2
@GabrielaMelo Điều đó đã được thông qua trong hàm mở (tên tệp, 'a').
Piyush

21

Một chức năng trợ giúp nhỏ tôi sử dụng với một số biện pháp bảo vệ kiểm tra tiêu đề để xử lý tất cả:

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)

1
Chúng tôi có thể làm gì nếu thứ tự cột không khớp?
Mục tiêu Jason

@JasonGoal df = df.reindex (được sắp xếp (df.columns), trục = 1); xem stackoverflow.com/a/11067072/9095840 .
markemus

4

Ban đầu bắt đầu với một cơ sở dữ liệu pyspark - Tôi đã gặp lỗi chuyển đổi loại (khi chuyển đổi sang pandas df's và sau đó gắn vào csv) với các loại lược đồ / cột trong các cơ sở dữ liệu pyspark của tôi

Đã giải quyết vấn đề bằng cách buộc tất cả các cột trong mỗi df phải là kiểu chuỗi và sau đó nối thêm nó vào csv như sau:

with open('testAppend.csv', 'a') as f:
    df2.toPandas().astype(str).to_csv(f, header=False)

3

Đến bữa tiệc muộn một chút nhưng bạn cũng có thể sử dụng trình quản lý ngữ cảnh, nếu bạn mở và đóng tệp của mình nhiều lần hoặc ghi nhật ký dữ liệu, số liệu thống kê, v.v.

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)`
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.