将pandas数据框中的前N行写入CSV文件。

7

如何在不先对df进行子集操作的情况下,从pandas dataframe中仅写入前N行或从P到Q行到csv?由于内存问题,我无法对要导出的数据进行子集操作。

我考虑编写一个逐行写入csv的函数。

谢谢


只是切片数据框吗? - Paritosh Singh
无法进行,因为存在内存问题。我可以详细说明,但我怀疑我们不会在那里找到解决方案。我想知道是否有可用于 to_csv 方法的选项,尽管我在文档中找不到它。或者只是一个直接逐行写入 csv 的函数。 - criticalth
请查看.to_csv()方法chunksize参数。 - asongtoruin
chunksize 指的是一次导出多少行数据... 但整个 CSV 文件仍会被导出。 - criticalth
以下每个似乎都可以复制文件内容,但它们似乎还会添加一个额外的列,看起来对应于索引。强烈建议在将数据框移动到 CSV 时删除索引(只需添加参数即可.to_csv(index=False))。 - Sachin Raghavendran
3个回答

13
  • 使用 head - 返回前 n 行。

示例:

import pandas as pd
import numpy as np
date = pd.date_range('20190101',periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=date, columns=list('ABCD'))

#wtire only top two rows into csv file
print(df.head(2).to_csv("test.csv"))

不是我要的,因为你事先对df进行了切片。我尝试过了,它会给我一个内存错误,因为我猜测pandas会复制.. - criticalth
1
@criticalth 我不知道pandas的head()函数是否会复制数据。我阅读了pandas文档,它用于返回数据框的前N行。 - bharatk

3

这个对您有用吗?

df.iloc[:N, :].to_csv()

或者
df.iloc[P:Q, :].to_csv()

我相信df.iloc通常会生成对原始数据帧的引用,而不是复制数据。如果仍然无法解决问题,您可能还需要尝试在to_csv调用中设置chunksize。也许pandas能够创建子集而不使用太多内存,但然后它会完全复制写入每个块的行。如果chunksize为整个数据帧,则在该点上会复制整个数据帧并耗尽内存。
如果所有其他方法都失败了,您可以循环遍历df.iterrows()df.iloc[P:Q, :].iterrows()df.iloc[P:Q, :].itertuples(),并使用csv模块编写每行(可能是writer.writerows(df.iloc[P:Q, :].itertuples())。

仍然给我一个MemoryError,我点赞了,因为这是有用的信息。 - criticalth
1
你能否尝试将其分为两个步骤,看看哪一个会导致内存错误?即,df2 = df.iloc[:N, :] 然后 df2.to_csv(..., chunksize=100) - Matthias Fripp
1
我试过了。就是 df.iloc[:N, :],我尝试使用比所需更小的 N,它可以工作,但这样做很丑陋。我还编写了一个逐行读取并几乎不使用 RAM 的程序,但速度很慢,所以我会采取中间的方法。很麻烦 to_csv 方法没有 nrows.. - criticalth

2
也许你可以像这样选择要写入 CSV 文件的行索引:
最初的回答
df[df.index.isin([1, 2, ...])].to_csv('file.csv')

最初的回答
或者使用这个:
df.loc[n:n].to_csv('file.csv')

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