2012-05-31 74 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