Самый быстрый способ разбить огромный набор данных в панды по столбцу даты - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть CSV-файл из 14 миллионов строк со столбцом даты (не первым столбцом), по которому я хочу отфильтровать и разделить данные.

В настоящее время я загружаю его в кадр данных pandas, чтобы сделатьэто:

df = pd.read_csv(filepath, dtype=str) 

for date in df['dates'].unique():
    subset = df[df['dates'] == date]
    subset.to_csv(date + dest_path)

Есть ли более быстрый способ сделать это?

Отфильтровать строки из CSV перед загрузкой в ​​pandas dataframe дает интересное решение, но, к сожалению, мой столбецразделить это не в первом столбце.

РЕДАКТИРОВАТЬ:

Мне просто нужно разделить файлы CSV на каждую дату.Полученные CSV-файлы передаются другой команде.Мне нужны все столбцы, я не хочу изменять какие-либо данные, мне не нужно делать какие-либо групповые.

1 Ответ

0 голосов
/ 08 декабря 2018

Основная проблема - чтение всего набора данных в память.Как правило, с очень большим файлом мне нужно читать файл построчно, потому что он не помещается в памяти.Поэтому я разделяю файл, и только тогда я могу работать с частями (либо с Python / pandas, R или Stata, которые загружают весь набор данных в память).

Чтобы разбить файл, я написал быCSV ридер с нуля.Не слишком сложно, если вам не нужно обрабатывать разделители внутри строк в кавычках (иначе это не намного сложнее с регулярным выражением ).Вероятно, возможно с меньшим количеством кода с помощью встроенного модуля csv (признаюсь, я никогда не использовал его).

Следующее разбивает файл в соответствии со значениями переменной.Также возможно адаптировать код для разделения на фиксированное количество строк, для фильтрации, добавления или удаления переменных ...

import sys

def main(arg):
    if len(arg) != 3:
        print("csvsplit infile outfile variable")
        return

    input_name = arg[0]
    output_name = arg[1]
    split_var = arg[2]

    sep = ","
    outfiles = {}

    with open(input_name) as f:
        var = f.readline().rstrip("\r\n").split(sep)
        ivar = {name: i for i, name in enumerate(var)}
        ikey = ivar[split_var]

        for line in f:
            v = line.rstrip("\r\n").split(sep)
            key = v[ikey]
            if key not in outfiles:
                outfiles[key] = open("%s_%s.csv" % (output_name, key), "wt")
                outfiles[key].write(sep.join(var) + "\n")
            outfiles[key].write(line)

    for key, outfile in outfiles.items():
        outfile.close()

main(sys.argv[1:])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...