我有一个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)
我的基本问题是如何检查第三列并将对存储在群集中?
答案 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]
(或者首先使用较小的数字作为键)