如何从CSV文件中聚类(或分组)数据?

时间:2014-07-18 15:35:36

标签: python list csv cluster-computing

我有一个CSV列的三列数据

A,B,10
A,C,15
A,D,21
B,A,10
B,C,20

我想基于第三列对A,B,C,D组进行分组或聚类。条件是10. 0-10一个簇的增量,11-20另一个簇的增量,依此类推。每个群集将包含A,B,C,D对。基本上,如果第三列在0到10之间,则一对将进入第一个簇。 A,B在第三列中有10个,因此它们进入第一个簇。我希望它是10-15个集群。

以下是我打开CSV的方式:

fileread = open('/data/dataset.csv', 'rU')
readcsv = csv.reader(fileread, delimiter=',')

L = list(readcsv)

我创建了一个集合:

set(item[2] for item in L if (item[0]=='A' and item[1] == 'B' and item[2] <= 10)

我的基本问题是如何检查第三列并将对存储在群集中?

1 个答案:

答案 0 :(得分:2)

这个怎么样:循环数据并通过整数除以第三个元素来确定组。

import csv
with open('data.txt') as f:
    groups = {}
    for item in list(csv.reader(f, delimiter=',')):
        n = int(item[2]) // 10
        group = "%d-%d" % (n*10, n*10+9)
        groups.setdefault(group, []).append(item[:2])

使用您的数据,groups最终结果如下:

{'20-29': [['A', 'D'], ['B', 'C']], 
 '10-19': [['A', 'B'], ['A', 'C'], ['B', 'A']]}

字典是无序的,因此如果要按排序顺序打印它们,则必须对键进行排序。这有点棘手,因为它们是字符串并且将按字典顺序排序。但你可以这样做:

for k in sorted(groups, key=lambda k: int(k.split('-')[0])):
    print k, groups[k]

(或者首先使用较小的数字作为键)