Чтение матрицы терминов-документов из 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)
быстро и просто!