如何对CSV文件中的数据进行聚类?
我有一个包含三列数据的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 个回答
2
这样做怎么样呢:循环遍历数据,通过将第三个元素除以10来确定分组。
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]
(或者一开始就用更小的数字作为键)