如何对CSV文件中的数据进行聚类?

1 投票
1 回答
2378 浏览
提问于 2025-04-18 13:51

我有一个包含三列数据的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]

(或者一开始就用更小的数字作为键)

撰写回答