Я загружаю в файл CSV построчно, потому что в нем ~ 800 миллионов строк, и есть много таких файлов, которые мне нужно проанализировать, поэтому параллельная загрузка имеет первостепенное значение, а также необходима построчная загрузка, поэтомукак не взорвать память.
Мне был дан ответ о том, как рассчитать количество записей, в которых уникальные идентификаторы присутствуют во всем наборе данных, используя collections.Counter()
.(см. Подсчет вхождений столбца csv на лету в Python )
Но есть ли способ вычислить промежуточный итог записей данных в другом столбце строки для каждого уникального идентификатора?из другого столбца?
например.Предположим, что данные в вашем CSV-файле имеют только два столбца и поэтому выглядят следующим образом:
[1 1]
[1 1]
[2 2]
[3 2]
[2 2]
[1 2]
Где второй столбец содержит уникальные идентификаторы, для которых вы хотите сохранить промежуточный итог значений в первомколонка.Таким образом, ваш вывод должен выглядеть следующим образом:
{'1': 2, '2': 8}
Где для идентификатора '1' во втором столбце, общее значение дается 1 + 1 в первом столбце.А для идентификатора '2' в первом столбце итоговое значение определяется как 2 + 3 + 2 + 1.
Как можно сделать это быстро, учитывая огромный размер CSV, с которым я работаю?
import csv
features = {}
with open(filename) as f:
reader = csv.reader(f,delimiter=',')
for row in reader:
ID = row[1]
if SrcDevice not in features.keys():
features[ID] = {}
features[ID]['Some_feature'] = 0
features[SrcDevice]['Some_feature'] += float(row[0])
Но так много строк занимает слишком много времени.Идея заключается в том, что я бы также создал аналогичный словарь, но с количеством вхождений, чтобы я мог разделить словарь функций по этому словарю, чтобы вычислить среднее значение функций.(Кажется ненужным, но помните, что эти файлы настолько велики, что читаются построчно).
Использование sqlite3 было упомянуто в связанном вопросе, но мне было бы интересно узнать, можно ли это эффективно сделать в первую очередь в Python.Заранее спасибо!