【发布时间】:2019-04-02 01:21:47
【问题描述】:
假设我正在处理一个非常大的 csv 文件。所以,我只能将数据逐块读取到内存中。预期的事件流应该如下:
1) 使用 pandas 从 csv 读取数据块(例如:10 行)。
2) 颠倒数据顺序
3) 将每一行反向复制到新的 csv 文件。所以每个块(10行)是 以相反的顺序从头开始写入 csv。
最后,csv 文件应该是相反的顺序,并且应该在不将整个文件加载到 Windows 操作系统的内存中的情况下完成。
我正在尝试进行时间序列预测,我需要数据从旧到最新(第一行最旧条目)。我无法将整个文件加载到内存中,如果可能的话,我正在寻找一种方法来一次处理每个块。
我在来自 kaggle 的 Rossmann dataset 的 train.csv 上尝试的数据集。你可以从这个github repo得到它
我的尝试没有正确地将行复制到新的 csv 文件中。
下面是我的代码:
import pandas as pd
import csv
def reverse():
fields = ["Store","DayOfWeek","Date","Sales","Customers","Open","Promo","StateHoliday",
"SchoolHoliday"]
with open('processed_train.csv', mode='a') as stock_file:
writer = csv.writer(stock_file,delimiter=',', quotechar='"',
quoting=csv.QUOTE_MINIMAL)
writer.writerow(fields)
for chunk in pd.read_csv("train.csv", chunksize=10):
store_data = chunk.reindex(index=chunk.index[::-1])
append_data_csv(store_data)
def append_data_csv(store_data):
with open('processed_train.csv', mode='a') as store_file:
writer = csv.writer(store_file,delimiter=',', quotechar='"',
quoting=csv.QUOTE_MINIMAL)
for index, row in store_data.iterrows():
print(row)
writer.writerow([row['Store'],row['DayOfWeek'],row['Date'],row['Sales'],
row['Customers'],row['Open'],row['Promo'],
row['StateHoliday'],row['SchoolHoliday']])
reverse()
提前谢谢你
【问题讨论】:
-
您希望对整个数据进行时间排序,但您从一开始就一次排序和写入 10 个数据。这就是为什么你没有得到结果。为什么不从最后阅读并反转 train.csv。见,stackoverflow.com/a/10933932/2895956
-
我之前尝试过该帖子中给出的代码。但它没有给我一个合适的结果。
-
您能详细说明一下吗?你到底得到了什么?如果可能的话,将文件上传到保管箱中。过程太长,(下载该文件一个人必须登录,注册然后填写信息......bla..bla..)只是为了下载文件。
-
注意:不是一个完美的解决方案。但是,您可以使用 cmd 行、tail -r train.csv > reverse.csv 简单地还原文件。并手动删除最后一行并将其添加到 reverse.csv 中的第一行
标签: python python-3.x pandas csv dataset