如何在不连接的情况下读取 Python 数据框中的数据?
How to read data in Python dataframe without concatenating?
我想将文件 f(文件 size:85GB)分块读取到数据帧中。建议使用以下代码。
chunksize = 5
TextFileReader = pd.read_csv(f, chunksize=chunksize)
但是,这段代码给我的是 TextFileReader,而不是数据框。另外,由于内存限制,我不想连接这些块以将 TextFileReader 转换为数据帧。请指教
当您尝试处理 85GB 的 CSV 文件时,如果您尝试通过将其分成块并将其转换为数据帧来读取所有数据,那么它肯定会达到内存限制。您可以尝试使用不同的方法来解决此问题。在这种情况下,您可以对数据使用过滤操作。例如,如果您的数据集中有 600 列,而您只对 50 列感兴趣。尝试只从文件中读取 50 列。这样你会节省很多内存。在阅读时处理行。如果您需要先过滤数据,请使用生成器函数。 yield
使函数成为生成器函数,这意味着在您开始循环它之前它不会做任何工作。
有关生成器函数的更多信息:
Reading a huge .csv file
高效过滤参考:https://codereview.stackexchange.com/questions/88885/efficiently-filter-a-large-100gb-csv-file-v3
用于处理较小的数据集:
方法一:将reader对象直接转换为dataframe:
full_data = pd.concat(TextFileReader, ignore_index=True)
concat函数需要加参数ignore index,避免索引重复
方法二: 使用Iterator或get_chunk将其转化为dataframe
通过将块大小指定为 read_csv,return 值将成为 TextFileReader 类型的可迭代对象。
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 中的块总数
for chunk_number, chunk in enumerate(TextFileReader):
# some code here, if needed
pass
print("Total number of chunks is", chunk_number+1)
如果文件较大,我不会推荐第二种方法。例如,如果 csv 文件包含 100000 条记录,则 chunksize=5 将创建 20,000 个块。
如果你想接收数据帧作为处理块的结果,你可以这样做。在初始化块迭代之前初始化空数据框。完成过滤过程后,您可以将每个结果连接到数据框中。因此,您将在 for 循环下收到根据您的条件过滤的数据帧。
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])
full_dataframe = pd.DataFrame(TextFileReader.get_chunk(100000))
我想将文件 f(文件 size:85GB)分块读取到数据帧中。建议使用以下代码。
chunksize = 5
TextFileReader = pd.read_csv(f, chunksize=chunksize)
但是,这段代码给我的是 TextFileReader,而不是数据框。另外,由于内存限制,我不想连接这些块以将 TextFileReader 转换为数据帧。请指教
当您尝试处理 85GB 的 CSV 文件时,如果您尝试通过将其分成块并将其转换为数据帧来读取所有数据,那么它肯定会达到内存限制。您可以尝试使用不同的方法来解决此问题。在这种情况下,您可以对数据使用过滤操作。例如,如果您的数据集中有 600 列,而您只对 50 列感兴趣。尝试只从文件中读取 50 列。这样你会节省很多内存。在阅读时处理行。如果您需要先过滤数据,请使用生成器函数。 yield
使函数成为生成器函数,这意味着在您开始循环它之前它不会做任何工作。
有关生成器函数的更多信息: Reading a huge .csv file
高效过滤参考:https://codereview.stackexchange.com/questions/88885/efficiently-filter-a-large-100gb-csv-file-v3
用于处理较小的数据集:
方法一:将reader对象直接转换为dataframe:
full_data = pd.concat(TextFileReader, ignore_index=True)
concat函数需要加参数ignore index,避免索引重复
方法二: 使用Iterator或get_chunk将其转化为dataframe
通过将块大小指定为 read_csv,return 值将成为 TextFileReader 类型的可迭代对象。
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 中的块总数
for chunk_number, chunk in enumerate(TextFileReader):
# some code here, if needed
pass
print("Total number of chunks is", chunk_number+1)
如果文件较大,我不会推荐第二种方法。例如,如果 csv 文件包含 100000 条记录,则 chunksize=5 将创建 20,000 个块。
如果你想接收数据帧作为处理块的结果,你可以这样做。在初始化块迭代之前初始化空数据框。完成过滤过程后,您可以将每个结果连接到数据框中。因此,您将在 for 循环下收到根据您的条件过滤的数据帧。
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])
full_dataframe = pd.DataFrame(TextFileReader.get_chunk(100000))