pandas DataFrame输出csv末尾

46

我想知道如何将新的DataFrame数据添加到现有csv文件的末尾? to_csv没有提到这样的功能。


4个回答

80
你可以通过传递一个以追加模式打开的文件来使用 to_csv 进行追加操作:
with open(file_name, 'a') as f:
    df.to_csv(f, header=False)

使用header=None,以避免追加列名。
事实上,Pandas有一个包装器可以在to_csv中使用mode参数来完成此操作(请参见Joe的答案)。
df.to_csv(f, mode='a', header=False)

3
同时需要通过 f.close() 关闭文件。Andy,你让我的一天美好起来了。它的效果非常好,我来自 C/C++ 的背景,需要学习 Python 哲学。有什么建议吗? - perigee
1
这个代码在 to_csv 之后关闭了文件,非常棒。我有一些经常使用 to_csv 的代码,在后续迭代中发现文件没有被关闭。 - Ezekiel Kruglick
@EzekielKruglick 你是将一个已打开的文件传递给了 to_csv 函数还是传递了文件名?我记得有一个相关问题,如果不关闭文件,会导致他们的代码速度提高了99%(如果我没记错的话,他们一次追加到了相同文件中成千上万次)。 - Andy Hayden
@EzekielKruglick 有趣的是你提到了上面的99%统计数据 - 那是在Windows上,而我只看到了33%的OSX。如果我没记错,close是慢的部分。我的猜测是触发器将缓冲区从内存写入磁盘(复制整个文件),而Unix则有一些更聪明的文件系统...不太确定。我强烈建议研究HDF5/pytables。 - Andy Hayden
1
@perigee 当使用 "with" 时,文件总是自动关闭的。http://blog.lerner.co.il/dont-use-python-close-files-answer-depends/ - lesolorzanov
显示剩余5条评论

47

您也可以将文件模式作为参数传递给to_csv方法

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

4

以下是我使用的一些小助手函数(基于Joe Hooper的答案),添加了一些标题检查保障以处理所有内容:

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)

第三个测试用例中是否有API设置,数据框和CSV之间的列顺序不匹配?我想要写入没有标题的数据,但是让列被隐式重新排序。 - floatingice

3
感谢Andy,提供了完整的解决方案:
f = open(filename, 'a') # Open file as append mode
df.to_csv(f, header = False)
f.close()

8
仅仅提一下,这与上述内容基本等价,但使用此方法后你将得到一个已经关闭的文件(f),而使用with则会自动清理。 :) - Andy Hayden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接