我的数据如下:
549 648.077 0.01
552 648.141 0.45
554 647.167 0.1
572 648.141 0.3
530 630.213 0.69
560 670.312 0.70
文件中有几千行
1st
行的值范围为0-1100
2nd
行的值范围为600-700
3rd
行值范围为0-1
我需要绘制数据,因此需要对数据进行排序和修改:
我需要将第3行值(正常范围0.0-1.0
)拆分为细分0.0-0.20
,0.21-0.40
,0,41-0,60
,0.61-0.80
,{{1} }
接下来,我需要将0.81-1.00
行(正常范围(1st
)中的细分为0-1100
,0-10
,11-20
等细分最多1100。
我想要做的是在区域21-30
和2nd
,0.0-0.20
和0-10
,0.0-0.20
和{{中找到所有11-20
行值1}}。
找到后我想将它们全部加在一起并将值除以出现次数以得到平均值:所以我想要一个0.0-0.20
和21-30
之间的区域{{1} }。我对python很新,我认为这是某种方法:
0.0-0.20
这应该有效(没有打印当然)来获取重复的值,而不是0-10
.....这应该给我带来我想要的值但是有一个简单的方法来设置范围从0-1100开始以10个单位步骤?
P.S。:我知道我为一个相对较短的问题提供了很多信息,那是因为我不知道python是否是最好的方法,如果我的方法是合理的?也许我应该选择value
,但我刚安装了。因此,如果有人知道更简单(也许不是编码相关)的方式来解决这样的问题,我真的很感激。
答案 0 :(得分:1)
您需要一个排序键才能以正确的顺序存储数据;然后你可以循环通过它来分组并得到你的总和。 itertools.groupby
非常适合此类事情:
import os
import csv
from itertools import groupby
data_list = []
with open("table.csv") as csv_file:
data_reader = csv.reader(csv_file, dialect='excel-tab')
for row in data_reader:
# read and convert data
data_list.append((int(row[0]), float(row[1]), float(row[2])))
def classify(row):
# returns classification of row based on third value, then first value
# i.e. [549, 648.077, 0.01] -> (0.0, 540)
# [572, 648.141, 0.3] -> (0.3, 570)
first, second, third = row
for level3 in (0.2, 0.4, 0.6, 0.8):
if third <= level3:
break
else:
level3 = 1.0
for level1 in range(10, 1100, 10):
if first <= level1:
break
else:
level1 = 1100
return level3, level1
data_list.sort(key=classify)
plot_values = []
for key, group in groupby(data_list, classify):
group = list(group)
number_of_elements = len(group)
mean = sum([r[2] for r in group]) / number_of_elements
plot_values.append((key, mean))
print('\n'.join(['%-10s -> %s' % (k, m) for k, m in plot_values]))
针对您提供的示例数据运行时:
(0.2, 550) -> 0.01
(0.2, 560) -> 0.1
(0.4, 580) -> 0.3
(0.6, 560) -> 0.45
(0.8, 530) -> 0.69
(0.8, 560) -> 0.7