簡體   English   中英

熊貓:連續從函數寫入到csv

[英]Pandas: Continuously write from function to csv

我為Pandas設置了一個函數,該函數在input.csv中運行大量行並將結果輸入到Series中。 然后將Series寫入output.csv

但是,如果該過程被中斷(例如,由於意外事件),程序將終止,並且所有本應進入csv的數據都將丟失。

有沒有一種方法可以將數據連續寫入到csv中,而不管函數是否對所有行都完成了?

通常,每次程序啟動時, output.csv創建一個空白output.csv ,並在函數運行時附加到該輸出。

import pandas as pd

df = pd.read_csv("read.csv")

def crawl(a):
    #Create x, y
    return pd.Series([x, y])

df[["Column X", "Column Y"]] = df["Column A"].apply(crawl)
df.to_csv("write.csv", index=False)

這是一種可能的解決方案,它將在讀取塊中的csv時將數據追加到新文件中。 如果該過程被中斷,則新文件將包含直到中斷為止的所有信息。

import pandas as pd

#csv file to be read in 
in_csv = '/path/to/read/file.csv'

#csv to write data to 
out_csv = 'path/to/write/file.csv'

#get the number of lines of the csv file to be read
number_lines = sum(1 for row in (open(in_csv)))

#size of chunks of data to write to the csv
chunksize = 10

#start looping through data writing it to a new file for each chunk
for i in range(1,number_lines,chunksize):
     df = pd.read_csv(in_csv,
          header=None,
          nrows = chunksize,#number of rows to read at each loop
          skiprows = i)#skip rows that have been read

     df.to_csv(out_csv,
          index=False,
          header=False,
          mode='a',#append data to csv file
          chunksize=chunksize)#size of data to append for each loop

最后,這就是我的想法。 感謝您的幫助!

import pandas as pd

df1 = pd.read_csv("read.csv")

run = 0

def crawl(a):

    global run
    run = run + 1

    #Create x, y

    df2 = pd.DataFrame([[x, y]], columns=["X", "Y"])

    if run == 1:
        df2.to_csv("output.csv")
    if run != 1:
        df2.to_csv("output.csv", header=None, mode="a")

df1["Column A"].apply(crawl)

我建議這樣做:

with open("write.csv","a") as f:
    df.to_csv(f,header=False,index=False)

參數“ a”會將新的df附加到現有文件中,並且在with塊完成后該文件將關閉,因此您應保留所有中間結果。

我已經找到了解決類似問題的方法,方法是使用iterrows()循環數據框並將每一行保存到csv文件中,在您的情況下,可能是這樣的:

for ix, row in df.iterrows():
    row['Column A'] = crawl(row['Column A'])

    # if you wish to mantain the header
    if ix == 0:
        df.iloc[ix - 1: ix].to_csv('output.csv', mode='a', index=False, sep=',', encoding='utf-8')
    else:
        df.iloc[ix - 1: ix].to_csv('output.csv', mode='a', index=False, sep=',', encoding='utf-8', header=False)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM