2015-10-26 134 views
1

我的数据是这样的:排序列多.csv文件的Python

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 我需要绘制数据,因此需要进行排序并修改数据:

我需要将第三行值(正常范围0.0-1.0)分割成段0.0-0.200.21-0.400,41-0,600.61-0.800.81-1.00

接下来,我需要从1st行(正常范围(0-1100)段分成段像0-1011-2021-30等多达1100 我想要做的是找到一个再内的所有2nd行值gion 0.0-0.200-10,0.0-0.2011-200.0-0.2021-30

当发现我想所有这些加在一起,并通过出现的次数除以值获得的平均值:所以我要为0.0-0.200-10一个value之间的区域。我是相当新的蟒蛇,我认为这是某种形式的做法:

import os              
import csv              
dataList = []             
with open("table.csv") as csv_file:       
data_reader = csv.reader(csv_file, dialect='excel-tab')   
for rows in data_reader:          
    if float(rows[2]) <= 0.20:         
     if float(rows[0]) <= 10:        
      print(rows)          
     if 10 <float(rows[0])<=20:        
      print (rows) 

这应该工作(当然没有打印),以获得值,反复比if 20<float(rows[2])<= 30: .....那应该为我带来我想要的值,但有没有一种简单的方法可以在10个单位范围内设置范围从0到1100的范围?

P.S .:我知道我给了一个相对较短的问题很多的信息,这是因为我真的不知道python是否是最好的方式来做到这一点,如果我的方法是合理的?也许我应该去panda但我刚安装。所以如果有人知道更容易(也许不是编码相关)的方式来解决这样的问题,我真的很感激它。

回答

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 
+0

非常感谢你快乐多,模块是巨大的:我只是改变了'平均= SUM(因为我想要每个段的第二行数据的平均值,但似乎我没有提到那个cleary。不,它看起来就像它应该工作的方式一样 –