试图在范围

时间:2015-07-11 23:32:03

标签: python data-manipulation

我正在使用python。我试图将一组数据划分为1000个元素范围并找到平均值,包括不存在为0.0的网站。

以下是数据样本。

X 2699528 0.000786782 X 2699555 0.493415 X 2699559 0.000786782 X 2699625 0.0748873 X 2699645 0.0712507 X 2699664 0.000786782 X 2699676 0.400653 X 2699683 0.0109586 X 2699711 0.000786782 X 2699739 0.00157294 X 2699906 0.0617229 X 2699919 0.000786782 X 2699934 0.000786782 X 2699968 0.498501 X 2700027 0.499971 X 2700040 0.000786782 X 2700089 0.0101799 X 2700147 0.000786782 X 2700157 0.0719793 X 2700185 0.00314341 X 2700189 0.000786782

我希望数据看起来像:

X 2700000 average1
X 2701000 average2
....

问题是每个范围内都没有一致的数字。某些范围可能在该范围内具有零元素。此外,我不仅仅想要一个平均值,而是一个不包括在内的网站的平均值。基本上,如果我有

X 1 10
X 3 10
X 5 10
X 7 10
X 9 10

我不想以10的平均值返回10,而是5(5个0和5个10')。

以下是我的代码。

import sys

sum = 0.0
startin = 2700000

for i in range(2700, 155000):
        m = (i * 1000) + 1000
        i = i * 1000
        for line in sys.stdin:
                data =line.strip().split('\t')
                if data[0] == "CHROM":
                        continue
                if int(data[1]) >= i and int(data[1]) <= m:
                        sum += float(data[2])
        print i, (sum/1000)
        continue

返回

2700000 0.002568799204
2701000 0.002568799204
2702000 0.002568799204
2703000 0.002568799204
2704000 0.002568799204
2705000 0.002568799204
2706000 0.002568799204
2707000 0.002568799204
2708000 0.002568799204
2709000 0.002568799204
2710000 0.002568799204
2711000 0.002568799204
2712000 0.002568799204
2713000 0.002568799204
2714000 0.002568799204
2715000 0.002568799204
2716000 0.002568799204
2717000 0.002568799204
2718000 0.002568799204
2719000 0.002568799204
2720000 0.002568799204
2721000 0.002568799204
2722000 0.002568799204

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

不是迭代每个可能范围的整个数据集,而是可以使用整数除法在一次迭代中将所有值分配给存储区。

buckets = defaultdict(float)
bucket_size = 1000

for line in lines:
    index,value = line.split()
    buckets[int(index)/bucket_size] += float(value)

for k,v in sorted(buckets.items()):
    print k,v/bucket_size