使用块读取大型csv文件时如何在连接块之前处理除一列之外的所有列

Posted

技术标签:

【中文标题】使用块读取大型csv文件时如何在连接块之前处理除一列之外的所有列【英文标题】:how to process all but one column before concatenating chunks when use chunks to read large csv file 【发布时间】:2017-09-20 20:11:47 【问题描述】:

我有一个大的 csv 文件 (7GB),我使用这些代码在 Pandas 中读取它:

chunks=pd.read_table('input_filename', chunksize=500000)
df=pd.DataFrame()
df=pd.concat((chunk==1) for chunk in chunks)

这对我有用,因为文件是单热编码的,所以chunk==1 部分将 0 和 1 转换为布尔值,这节省了我一些内存使用量。

现在我想用同样的方法读入另一个文件,唯一的问题是新文件有一个ID 列,它不是单热编码的。我的问题是:如何保持ID 列完整并以相同方式转换其余列?

我尝试了一些子集技术,包括:

df=pd.concat((chunk.loc[:, -1]==1) for chunk in chunks)

但到目前为止,它们都没有奏效。

谢谢!

【问题讨论】:

【参考方案1】:

试试这个:

chunks = pd.read_csv('input_filename', chunksize=500000, index_col='ID')
df = pd.concat([chunk.astype(bool) for chunk in chunks]).reset_index()

【讨论】:

我明白了!但它会抛出一个错误:Generator expression must be parenthesized if not sole argument。然后我试了下:df=pd.concat((chunk.set_index('ID').astype(bool)) for chunk in chunks, ignore_index=True),还是同样的错误……也许我把括号加错地方了? 嗨@MaxU,我自己也试过了。还是一样的错误。可能是由于不同版本的 Python/Pandas 造成的吗?我的 Python 是 2.7.13,我的 pandas 是 0.20.2。谢谢! 经过反复试验,我发现删除ignore_index=True部分后,代码可以工作。所以现在对我有用的是`df=pd.concat((chunk.set_index('ID').astype(bool)) for chunks)'。

以上是关于使用块读取大型csv文件时如何在连接块之前处理除一列之外的所有列的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中处理大型 csv 文件

在 R 中读取大型 csv 文件

逐行读取时大型CSV文件的索引元素

使用pandas处理大型CSV文件

macmatlab导入大型csv

在 R 中处理大型 csv 文件时避免挂断