วิธีเพิ่มข้อมูล pandas ไปยังไฟล์ csv ที่มีอยู่


259

ฉันต้องการทราบว่าเป็นไปได้หรือไม่ที่จะใช้to_csv()ฟังก์ชั่นแพนด้าเพื่อเพิ่มดาต้าเฟรมให้กับไฟล์ csv ที่มีอยู่ ไฟล์ csv มีโครงสร้างเดียวกันกับข้อมูลที่โหลด


6
ฉันคิดว่าวิธีการที่แนะนำโดย @tlingf ดีกว่าเพราะเขาใช้ฟังก์ชัน build-in ของไลบรารี pandas เท่านั้น เขาแนะนำโหมดกำหนดเป็น "a" "A" หมายถึง APPEND 'df.to_csv (' my_csv.csv ', โหมด =' a ', header = False)'
Ayrat

1
คำตอบจาก @KCzar พิจารณาทั้งสองกรณีเมื่อไม่มีไฟล์ CSV (เช่นเพิ่มส่วนหัวคอลัมน์) และเมื่อ CSV มีอยู่แล้ว (ดังนั้นให้เพิ่มเฉพาะแถวข้อมูลที่ไม่มีส่วนหัว) ไม่ว่าในกรณีใดจะใช้โหมด "ผนวก" และตัวคั่นแบบกำหนดเองพร้อมกับตรวจสอบจำนวนคอลัมน์
TPPZ

คำตอบ:


544

คุณสามารถระบุโหมดการเขียนหลามได้ในto_csvฟังก์ชั่นนุ่น สำหรับการผนวกมันคือ 'a'

ในกรณีของคุณ:

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

โหมดเริ่มต้นคือ 'w'


7
ขอบคุณสำหรับคำตอบ. นี่จะอนุญาตให้ฉันผนวก df ใหม่ต่อท้ายแถวได้ แต่คุณช่วยให้ฉันรู้ว่าฉันจะผนวก df ใหม่ในคอลัมน์ที่ชาญฉลาดได้อย่างไร
datanew

ฉันสามารถทำได้โดยอ่าน 'my_csv.csv' อีกครั้งจากนั้นเชื่อมต่อ df ใหม่แล้วบันทึก หากคุณรู้วิธีการที่ง่ายขึ้นโปรดแจ้งให้เราทราบ ข้าพเจ้าซาบซึ้ง!
datanew

2
วิธีเขียนส่วนหัวสำหรับไฟล์แรกและแถวที่เหลือจะถูกต่อท้ายโดยอัตโนมัติ
Etisha

4
@Etisha คล้ายกับdf.to_csv(output_path, mode='a', header=not os.path.exists(output_path))
Michele Tonutti

255

คุณสามารถผนวก csv โดยเปิดไฟล์ในโหมดต่อท้าย:

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

หากนี่คือ csv ของคุณfoo.csv:

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

หากคุณอ่านและต่อท้ายเช่น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 กลายเป็น:

,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)
  • สร้างไฟล์เว้นแต่จะมีอยู่เป็นอย่างอื่นผนวก
  • เพิ่มส่วนหัวหากมีการสร้างไฟล์มิฉะนั้นข้าม

2
มันหายไปmode='a'เป็นพารามิเตอร์ให้กับto_csv(เช่นdf.to_csv(f, mode='a', header=f.tell()==0)
Gabriela Melo

2
@GabrielaMelo นั่นถูกส่งผ่านในฟังก์ชั่น open (ชื่อไฟล์, 'a')
Piyush

21

ฟังก์ชั่นตัวช่วยเล็ก ๆ น้อย ๆ ที่ฉันใช้กับการป้องกันส่วนหัวในการตรวจสอบเพื่อจัดการกับมันทั้งหมด:

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
เราจะทำอย่างไรถ้าคำสั่งคอลัมน์ไม่ตรงกัน
Jason Goal

@JasonGoal df = df.reindex (เรียงลำดับ (df.columns), แกน = 1); ดู stackoverflow.com/a/11067072/9095840
markemus

4

เริ่มต้นด้วย pyspark dataframes - ฉันได้รับข้อผิดพลาดในการแปลงประเภท (เมื่อแปลงเป็น pandas df และต่อจาก csv) ที่ได้รับ schema / ประเภทคอลัมน์ใน pyspark dataframes ของฉัน

แก้ไขปัญหาโดยการบังคับให้คอลัมน์ทั้งหมดในแต่ละ df เป็นสตริงประเภทแล้วต่อท้ายสิ่งนี้กับ csv ดังนี้:

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

3

ช้าไปงานปาร์ตี้ แต่คุณยังสามารถใช้ตัวจัดการบริบทหากคุณกำลังเปิดและปิดไฟล์หลายครั้งหรือบันทึกข้อมูลสถิติ ฯลฯ

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)`
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.