2014-07-18 37 views
1

我有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) 

我在這裏的基本問題是如何檢查的第三列和對存儲在一個集羣?

+0

你嘗試過這麼遠嗎?最後例子中的語法提示了一個字典 - 你試過了嗎?你可以生成'輸出產生的三列比較'(原文如此)嗎?你的問題到底是什麼? – jonrsharpe

+0

@jonrsharpe我已經更新了這個問題。 –

+0

@jonrsharpe只是一個想法:而不是快速判斷和降級人們的問題,只是想一下,然後行動......就像tobias_k做的那樣......那麼這將是一個更好的社區 –

回答

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] 

(或擺在首位只使用數量較少鍵)

+0

工作得很好...但它跳過了一些有151-160的CSV,但它從120-129開始跳到50-59 ... –

+0

我認爲字典不是爲了順序。 –

+1

這很正常。字典總是無序的。如果你想按排序順序打印它們,只需對鍵進行排序......但是現在,鍵是字符串,所以'150-159'將在之前排序,例如, '20 -29' 。當然,你可以使用150和20作爲鍵,然後這將工作。 –

相關問題