通过csv文件中的块读取和反转数据块并复制到新的csv文件

Sul*_*_28 14 python csv dataset python-3.x pandas

假设我正在处理一个非常大的csv文件.所以,我只能通过chunk将数据块读入内存.预期的事件流程应如下:

1)使用pandas从csv读取数据块(例如:10行).

2)颠倒数据的顺序

3)反过来将每行复制到新的csv文件.所以每个块(10行)从反向开始写入csv.

最后,csv文件应该颠倒顺序,这应该在不将整个文件加载到Windows OS的内存中的情况下完成.

我正在尝试做一个时间序列预测我需要数据从旧到最新(第一行最旧的条目).我无法将整个文件加载到内存中我正在寻找一种方法,如果可能的话,每次都可以执行每个块.

我尝试了来自kaggle train.csvRossmann数据集的数据集.你可以从中得到它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()
Run Code Online (Sandbox Code Playgroud)

先感谢您

gus*_*coh 6

使用 bash,您可以拖尾除第一行之外的整个文件,然后将其反转并将其存储为:

tail -n +2 train.csv  | tac > train_rev.csv
Run Code Online (Sandbox Code Playgroud)

如果要在反转文件中保留header,先写好,再追加反转内容

head -1 train.csv > train_rev.csv; tail -n +2 train.csv  | tac >> train_rev.csv
Run Code Online (Sandbox Code Playgroud)


Abh*_*ari -3

您有重复的代码块,并且您根本没有利用 pandas。

@sujay kumar 指出的非常正确,我会更仔细地阅读。

文件一点也不大。我使用的 OHLCV 刻度数据以 GB 为单位,没有任何问题。如果您使用,pandas.read_csv()则不必进行分块传输。当然这需要时间,但效果会很好。除非你要使用太字节。我还没有测试过。

当您read_csv()不指定任何索引时。如果你这样做了,你可以根据订单打电话sort_index()或不打电话。ascending=False

Pandas 也可以写入 CSV,请改用它。我正在粘贴一些示例代码供您组合。

df_temp = pd.read_csv(file_path, parse_dates=True, index_col="Date", usecols=["Date", "Adj Close"], na_values=["nan"])

对系列进行排序

s = pd.Series(list('abcde'), index=[0,3,2,5,4]) s.sort_index()

注意:如果您坚持使用 Pandas 及其函数,您将运行已经优化的代码,不需要将整个文件加载到内存中。这太简单了,几乎就像作弊一样:)