【问题标题】:Iterate thru distance then average遍历距离然后平均
【发布时间】:2019-10-21 13:59:29
【问题描述】:

我有一个 csv(10k 记录),我需要遍历一段距离,然后是与每个长度相关的平均分数。因此,组距离在 0 英尺和 0.009 英尺之间,然后找到该长度的平均分数。将 0.01 英尺分组到 0.019 英尺,然后求平均分。求每增加 0.01 英尺的距离的平均分:

  feet, score
    0, 5
    0.001, 10
    0.002, 15
    0.003, 20
    0.004, 5
    0.006, 10
    0.008, 20
    0.009, 20
    0.01, 5
    0.011, 10
    0.012, 10
    0.013, 20
    0.013, 15
    0.014, 20
    0.016, 45
    0.017, 5
    0.018, 20
    0.019, 10
    0.02, 20

然后写入平均到另一个csv:

  feet, score
    0, 13.125
    0.01, 16

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 尝试截断到小数点后两位

标签: python csv average distance


【解决方案1】:

我刚刚为您的问题写了一个快速解决方案(不包括 .csv 部分),可能会对您有所帮助。我相信还有一个很好的列表理解。

data = [[0, 5], [1.2, 10], [0.01, 10]]
bounds = [0.1, 1, 2] # Just fill in your (upper) bounds here
grouped = []

# Create a new list with the first values "grouped"
for row in data:    # go through .csv file
    for i, upper_bound in enumerate(bounds):
        if row[0] <= upper_bound:
            grouped.append([bounds[i], row[1]])
            break

# Calculate the average for every group
for i, upper_bound in enumerate(bounds):
    amount = 0
    sum = 0
    for row in grouped:
        if row[0] == upper_bound:
            sum += row[1]
            amount += 1
    try:
        avg = (sum / amount)
        print(str(upper_bound) + ' --> ' + str(sum / amount))
    except: # divided by zero
        print(str(upper_bound) + ' --> 0')

【讨论】:

    【解决方案2】:

    类似这样的东西(其中 a.csv 是你的 500 行 csv):

    from collections import defaultdict
    import csv
    
    STEP = 0.01
    
    data = defaultdict(list)
    
    with open('a.csv') as f:
        reader = csv.reader(f,delimiter='\t')
        entries = sorted([entry for entry in reader][1:], key=lambda x: float(x[0]))
        for idx, entry in enumerate(entries):
            entry = [x for x in entry if x]
            feet = float(entry[0])
            score = float(entry[1].strip())
            if idx == 0 or feet - key >= STEP:
                key = feet
            data[key].append(score)
    for k, v in data.items():
        print('{} -> {}'.format(k, sum(v) / len(v)))
    

    输出

    0.0 -> 0.6259896916000001
    0.01 -> 0.7254650324999999
    0.02 -> 0.7559232991818182
    0.031 -> 0.7564042394999999
    0.041 -> 0.7016050595454545
    0.052 -> 0.5817978843000001
    0.062 -> 0.7553227885454544
    0.073 -> 0.7331994431
    0.083 -> 0.8406338765454549
    0.094 -> 0.9791227943636365
    0.105 -> 1.828199575
    0.115 -> 1.6872732038181821
    0.126 -> 1.6354184960000002
    0.136 -> 1.6679616310909091
    0.147 -> 1.8575009561000002
    0.157 -> 1.8417512092000003
    0.167 -> 1.8340773533636365
    0.178 -> 1.8425028184000003
    0.188 -> 2.1295739866
    0.198 -> 2.6459379091818183
    0.209 -> 2.3828843276000002
    0.219 -> 2.3275099136999997
    0.229 -> 2.4417235993636366
    0.24 -> 2.4380506703
    0.25 -> 2.5371588253000006
    0.26 -> 2.4149494077000004
    0.27 -> 2.2936866909000004
    0.28 -> 2.437273469181818
    0.291 -> 2.3236982016
    0.301 -> 2.4022541664
    0.311 -> 2.3130940562
    0.321 -> 2.5310746604
    0.331 -> 2.2081656021000002
    0.341 -> 2.2971205086363637
    0.352 -> 2.2664439074000002
    0.362 -> 2.2577037961000004
    0.372 -> 2.3274537939
    0.382 -> 2.3944920092000004
    0.392 -> 2.4642428165
    0.402 -> 2.463620020181818
    0.413 -> 2.3945957363000003
    0.423 -> 2.4159163421
    0.433 -> 2.4741425820000003
    0.443 -> 2.5781124094999996
    0.453 -> 2.4061227924
    0.463 -> 2.465448882181818
    0.474 -> 2.447893211090909
    0.484 -> 2.4245401217
    0.494 -> 2.5651068714000003
    

    【讨论】:

    • balderman 的代码有效,但在 0.02 处停止。我需要它继续循环遍历列表,因此它输出平均值: 0.3, 0.4, 0.5 。 . . 500.1
    • a.csv 是您在问题中发布的数据(仅几条记录)。您是否在 10K 记录中尝试过此代码?
    • balderman,感谢您的帮助!我做到了,但步长的平均值仅为 0-0.009、0.01-0.019,然后停止在 0.02。我需要它继续:0.02-0.029、0.03-0.039 等
    • 你能把文件的前 200 行上传到某个地方吗? (粘贴)
    • 将第 13 行更改为:score = float(entry[1])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 2015-07-13
    • 2013-04-17
    • 2021-08-30
    • 2019-03-20
    相关资源
    最近更新 更多