В 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, двойката ще отиде в първия клъстер. А, В има 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)
Основният ми въпрос тук е как да проверя третата колона и да съхраняваш двойките в клъстер?
Отговори:
2 за отговор № 1Какво ще кажете за това: Завъртете данните и определете групите, като делите третия елемент на 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]
(или използвайте само по-малкия номер като ключ на първо място)