2012-05-31 106 views
3

數據我有像數據的文件:如何分組蟒蛇

Entry Freq. 
    2  4.5 
    3  3.4 
    5  4.9 
    8  9.1 
    12 11.1 
    16 13.1 
    18 12.2 
    22 11.2 

我現在想解決的問題是:我想使它成爲一個分組數據(使用範圍10)的基礎上條目並且想要加入落入該範圍內的頻率。 例如對於上面的表格,如果我組它,然後它應該是這樣的:

Range SumFreq. 
    0-10 21.9(i.e. 4.5 + 3.4 + 4.9 + 9.1) 
    11-20 36.4 

我高達柱分離達成了下面的代碼,但不能能夠執​​行一系列分離的事情: 我的代碼是:

inp = ("c:/usr/ovisek/desktop/file.txt",'r').read().strip().split('\n') 
for line in map(str.split,inp): 
    k = int(line[0]) 
    l = float(line[-1]) 

到目前爲止很好,但我怎麼能夠將數據分組在10個範圍內。

回答

-1

你可以做這樣的事情:

fr = {} 
inp = open("file.txt",'r').read().strip().split('\n') 
for line in map(str.split,inp): 
    k = int(line[0]) 
    l = float(line[-1]) 
    key = abs(k-1)/10 * 10 

    if fr.has_key(key): 
     fr[key] += l 
    else: 
     fr[key] = l 

for k in sorted(fr.keys()): 
    sum = fr[k] 
    print '%d-%d\t%f' % (k+1 if k else 0, k+10, sum) 

輸出:

0-10 21.900000 
11-20 36.400000 
21-30 11.200000 
+0

但我怎麼能夠加起來的頻率,我只獲得了索引值。 – Ovisek

+1

使用defaultdict而不是檢查密鑰是否存在。 – jamylak

+0

@Ovisek我不知道你的意思,我在那裏添加了輸出,你輸入的樣本輸入。它應該做別的事嗎? – Amr

3

一種方式是[AB]使用的事實,整數除法會給你正確的垃圾桶:

import collections 
bin_size = 10 
d = collections.defaultdict(float) 
for line in map(str.split,inp): 
    k = int(line[0]) 
    l = float(line[-1]) 
    d[bin_size * (k // bin_size)] += l 
0

怎麼樣,只是添加到您的代碼有:

def group_data(range): 
    grouped_data = {} 
    inp = ("c:/usr/ovisek/desktop/file.txt",'r').read().strip().split('\n') 
    for line in map(str.split,inp): 
     k = int(line[0]) 
     l = float(line[-1]) 
     range_value = k // range 
     if grouped_data.has_key(range_value): 
      grouped_data[range_value]['freq'] = groped_data[range_value]['freq'] + l 
     else: 
      grouped_data[range_value] = {'freq':l, 'value':[str(range_value * range) + ':' + str((range_value + 1) * range)]} 
    return grouped_data 

這應該給你一個字典,如:

{1 : {'value':'0-10', 'freq':21.9} , .... } 
0

這應該讓你開始,測試罰款:

inp = open("/tmp/input.txt",'r').read().strip().split('\n') 
interval = 10 
index = 0 
resultDict = {} 
for line in map(str.split,inp): 
     k = int(line[0]) 
     l = float(line[-1]) 
     rangeNum = (int) ((k-1)/10) 
     rangeKeyName = str(rangeNum*10+1)+"-"+str((rangeNum+1)*10) 
     if(rangeKeyName in resultDict): 
       resultDict[rangeKeyName] += l 
     else: 
       resultDict[rangeKeyName] = l 

print(str(resultDict)) 

將輸出:

{'21-30': 11.199999999999999, '11-20': 36.399999999999999, '1-10': 21.899999999999999} 
+0

此代碼不能完全爲我工作。 Upto 9th Line它正在生成類別範圍,但沒有得到相加的頻率。我得到的代碼如下:{'221-230':1,'21 -30':3,'191-200':1,'41 -50':2,'1-10':1 ,'231-240':1,'91 -100':1} – Ovisek

+0

因此,我們不應該編寫完整的代碼,這應該有助於您作爲出發點。 – DhruvPathak