[英]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.