关于csv:如何在没有连接的情况下读取Python数据帧中的数据?

How to read data in Python dataframe without concatenating?

我想以块的形式将文件f(文件大小:85GB)读取到数据帧。 建议使用以下代码。

1
2
chunksize = 5
TextFileReader = pd.read_csv(f, chunksize=chunksize)

但是,这段代码给了我TextFileReader,而不是dataframe。 此外,由于内存限制,我不想连接这些块以将TextFileReader转换为dataframe。 请指教。


当您尝试处理85GB CSV文件时,如果您尝试通过将所有数据分成块并将其转换为数据帧来读取所有数据,那么它肯定会达到内存限制。您可以尝试使用不同的方法来解决此问题。在这种情况下,您可以对数据使用过滤操作。例如,如果数据集中有600列,并且您只对50列感兴趣。尝试从文件中只读取50列。这样你就可以节省大量内存。在阅读行时处理行。如果需要先过滤数据,请使用生成器函数。 yield使函数成为生成器函数,这意味着在开始循环之前它不会执行任何工作。

有关发电机功能的更多信息:
阅读一个巨大的.csv文件

有关高效过滤,请参阅:https://codereview.stackexchange.com/questions/88885/efficiently-filter-a-large-100gb-csv-file-v3

用于处理较小的数据集:

方法1:直接将reader对象转换为dataframe:

1
full_data = pd.concat(TextFileReader, ignore_index=True)

有必要在函数concat中添加参数ignore index,因为避免了索引的重复性。

方法2:使用Iterator或get_chunk将其转换为数据帧。

通过为read_csv指定chunksize,返回值将是TextFileReader类型的可迭代对象。

1
2
3
4
df=TextFileReader.get_chunk(3)

for chunk in TextFileReader:
    print(chunk)

资料来源:http://pandas.pydata.org/pandas-docs/stable/io.html#io-chunking

df= pd.DataFrame(TextFileReader.get_chunk(1))

这会将一个块转换为数据帧。

检查TextFileReader中的块总数

1
2
3
4
5
6
7
number_of_chunks=0

for chunk in TextFileReader:
   number_of_chunks=number_of_chunks+1


print(number_of_chunks)

如果文件大小较大,我不建议采用第二种方法。例如,如果csv文件包含100000条记录,则chunksize = 5将创建20,000个块。


如果您希望通过使用块来接收数据帧,则可以这样做。在初始化块迭代之前初始化空数据帧。完成过滤过程后,您可以将每个结果连接到数据框中。因此,您将收到根据for循环在条件下过滤的数据框。

1
2
3
4
5
6
7
file = 'results.csv'
df_empty = pd.DataFrame()
with open(file) as fl:
    chunk_iter = pd.read_csv(fl, chunksize = 100000)
    for chunk in chunk_iter:
        chunk = chunk[chunk['column1'] > 180]
        df_empty = pd.concat([df_empty,chunk])