Чтение матрицы терминов-документов из CSV с использованием Python

Причина, по которой классический csv reader не работает с массивами терминов, заключается в том, что первый столбец файла csv - это термины, а не значения. Таким образом, файл имеет следующий синтаксис:

"";"label1";"label2";"label3" ...
"term1";1;0;8;...
"term2";0;0;3;...
.................................

Мне нужно создать словарь, ключи которого - label1, label3 и т. Д., А значения - это векторы столбцов (здесь это будет: dict[label1]-> 1,0, dict[label2] -> 0,0 и т. Д.) Это означает, что эти термины совершенно бесполезны для меня.

Я реализовал собственное решение, которое выглядит примерно так:

....
keys = f.readline().split('";"') #1st line of the csv
keys = keys[1:]                  #skipping ""
zeros = [0] * len(keys)          #dicts initial values will be 0
d = OrderedDict(zip(keys, zeros))
lines = f.readlines()
for line in lines:
    ...
    splittting, stripping etc I get a list with values (eg: 1,0,8 - see example above)
    ...
    for value in values:
        ....

Однако чтение 8 файлов CSV (всего: 12 МБ) занимает более 90 минут на моем ноутбуке.

Кто-нибудь знает более эффективный способ справиться с этим?

2 ответа

Решение

Вы могли бы использовать csv модуль в любом случае, чтобы прочитать файлы CSV в память, а затем транспонировать строки с помощью zip(*rows) или же itertools.izip(*rows):

with open(somecsv, 'rb') as infile:
    reader = csv.reader(infile, delimiter=';')
    headers = next(reader)
    data = list(reader)
    data = dict(zip(headers, zip(*data)))

Это создает data словарь с заголовками в качестве ключей и столбцами в качестве значений. Вы можете удалить '' столбец "термины" из словаря, если это необходимо.

Для вашего входного примера data словарь выглядит так после выполнения приведенного выше кода:

{'': ('term1', 'term2'), 'label1': ('1', '0'), 'label2': ('0', '0'), 'label3': ('8', '3')}

Панды явно путь! Все, что вам нужно сделать, это загрузить фрейм данных в словарь, и он будет создан. Вот весь код, он быстрый и эффективный:

import pandas as pd
data = pd.read_csv(filename)
my_dict = dict(data)

быстро и просто!

Другие вопросы по тегам