Python 使用Pandas在现有的大型CSV文件上插入列,而无需消耗太多RAM

Python 使用Pandas在现有的大型CSV文件上插入列,而无需消耗太多RAM,python,database,pandas,format,filesize,Python,Database,Pandas,Format,Filesize,我正在阅读一个大的CSV文件,它使用的Python Pandas大小略大于2GB。最后,我试图做的是在文件的第一个索引中添加一个“日期”列,将文件从364行和大约360000列转换为只有三列(“日期”、“位置”和“数据”)的多行,然后将其写入一个新转换的CSV文件 更详细地说,364行中的每一行代表一年中的每一天。对于每一天(和每一行),有成千上万个站点位置(这些是列),每个包含在该位置进行的测量 文件现在看起来像这样: Index Location #1 Location #2

我正在阅读一个大的CSV文件,它使用的Python Pandas大小略大于2GB。最后,我试图做的是在文件的第一个索引中添加一个“日期”列,将文件从364行和大约360000列转换为只有三列(“日期”、“位置”和“数据”)的多行,然后将其写入一个新转换的CSV文件

更详细地说,364行中的每一行代表一年中的每一天。对于每一天(和每一行),有成千上万个站点位置(这些是列),每个包含在该位置进行的测量

文件现在看起来像这样:

Index     Location #1    Location #2    Location #359000...

0         Measurement    Measurement    Measurement
1         Measurement    Measurement    Measurement
2         Measurement    Measurement    Measurement
3         Measurement    Measurement    Measurement
364...    Measurement    Measurement    Measurement
我试图通过使用“date\u range”函数创建一个日期列,然后将该列插入一个新的数据框来添加新列

import pandas as pd

#read in csv file
df = pd.read_csv('Path to file')

#define 'Date' column
date_col = pd.date_range(start='1/1/2001', periods=364, freq='D')

#add 'Date' column at the 0th index to be the first column
df1 = df.insert(0, 'Date', date_col)

#rearrange rows to columns and index by date
long_df = df.set_index('Date').unstack().to_frame('Data').swaplevel().sort_index

#write out to new csv file, specifying two other columns via index label
long_df.to_csv('Transposed_csv_file', index=True, index_label=['Location', 'Data'])
我要查找的输出是一个转置的CSV文件,如下所示:

Date        Location          Data

1/1/2001    Location No. 1    Measurement 1
1/1/2001    Location No. 2    Measurement 2
1/1/2001    Location No. 3    Measurement 3
一旦1月1日结束,它将转移到1月2日,如下所示:

1/2/2001    Location No. 1    Measurement 1
1/2/2001    Location No. 2    Measurement 2
1/2/2001    Location No. 3    Measurement 3
这种模式将一直重复到2001年12月31日结束

三列--许多行。基本上,我是从X位置转换到Y位置格式的CSV文件


现在发生的事情是,当我试图运行这些代码行时,我通过任务管理器注意到我的内存正在慢慢消耗,达到96%以上。我有32GB的RAM。Pandas读取2GB CSV文件并输出另一个大的转置文件不可能消耗那么多内存。我不确定我需要什么我做错了,或者是否有更好的方法可以实现我想要的结果。谢谢你的帮助。

对于这么大的文件,我认为你最好使用perl进行转置。作为第一步,你可以使用awk将索引更改为日期。这需要一些研究。如果你还想这样做,我可以考虑另一个选项它使用Pandas是在列的数量上进行切分。基本上一次只读取多个列,进行转换,然后附加到主数据帧。只是一些想法。@Gal Sivan,我感谢您的响应,但是,我非常肯定我可以用Pandas来做这件事,因为我使用类似的代码abo转换了一个更小但不同类型的csv文件ve.在前一种情况下,我需要的列已经存在。我只需要重新格式化它。它确实有效。我只需要知道如何在第0个索引处添加一个日期列,然后我可以相应地重新格式化它。然后你可以使用第二种方法一次读取几列。熊猫的问题是,它对于大数据和我来说并不总是有效的n像这样的任务会生成大量数据帧的副本并将它们留在内存中。因此,如果您一次处理一小块数据,然后将它们添加到一起,您可能能够将其提取出来off@GalSivan,chunksize可以这样做吗?我知道你可以用它将一个文件分成多行。我会只读取指定数量的列,处理它们,然后然后在末尾连接?我相信您可以使用
usecols
参数指定要提取的列列表。请参见此处:它说明它可以节省内存和处理时间。您还可以作为迭代器读取并使用
chunksize
处理块。