使用python从csv中读取term-document矩阵

时间:2013-05-08 17:06:17

标签: python csv term-document-matrix large-data

经典csv阅读器无法在术语 - 文档数组上运行的原因是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文件(总计:12MB)需要90多分钟。

有没有人知道更有效的方法来解决这个问题?

2 个答案:

答案 0 :(得分:1)

您仍然可以使用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')}

答案 1 :(得分:1)

熊猫显然是要走的路!您所要做的就是将数据框加载到字典中,然后创建一个字典。以下是所有代码,它快速有效:

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

快捷方便!