我必须阅读大量的csv文件(5亿行),并尝试使用chunksize方法用pandas读取它们,以减少内存消耗。但我并不了解concat方法的行为以及读取所有文件和减少内存的选项。为了解释到目前为止我做了什么,我添加了一些伪代码。
让我们说我正在阅读,然后用n行连接一个文件:
iter_csv = pd.read_csv(file.csv,chunksize=n/2)
df = pd.concat([chunk for chunk in iter_csv])
然后我必须将一个函数应用于数据框,以根据某些值创建一个新列:
df['newcl'] = df.apply(function)
一切都很顺利。 但现在我想知道上述程序与以下程序之间的区别是什么:
iter_csv = pd.read_csv(file.csv,chunksize=n/2)
for chunk in iter_csv:
chunk['newcl'] = chunk.apply(function)
df = pd.concat([chunk])
就RAM消耗而言,我认为第二种方法应该更好,因为它只将函数应用于块而不是整个数据帧。但是会出现以下问题:
df = pd.concat([chunk])
放入循环中会返回一个大小为n / 2(块大小)的数据帧,而不是完整的数据帧; df = pd.concat([chunk])
放在外面,循环后返回相同的n / 2数据帧长度。所以我怀疑第一种方法(在read_csv
函数之后连接数据帧)是否是最好的方法,平衡速度和RAM消耗。而且我也想知道如何使用for循环来连接块。
感谢您的支持。