我有一个 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)
我的基本问题是如何检查第三列并将这些对存储在集群中?
最佳答案
这样怎么样:循环数据并通过将第三个元素整数除以 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])
使用您的数据,组
最终如下:
{'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]
(或者首先使用较小的数字作为键)
关于python - 如何对 CSV 文件中的数据进行聚类(或分组)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24828844/