2014-06-23 60 views
0

我正在处理从csv文件收集的列表或词典。我想这样做是写出来与特定的属性相关的最大值和最小值新的CSV文件,如:具有相同属性的Python最大和最小记录

field1 field2 field3 
1  hi  1 
2  hi  5 
3  bye 2 
4  bye 7 

应的属性在field2在新的CSV文件中列出如下:

f1 f2 min max 
1 hi 1  5 
2 bye 2  7 

我的数据结构非常薄弱,但我尝试了几种不同的方式,包括从csv文件中读取它。我认为如果我将数据放入字典或列表中,只要能够在找到最小值和最大值时将其输出到csv文件,就可以轻松找到它。

这是我试过的。我认为这是一个算法问题。底部的代码适用于我,但我不知道什么时候它们不再相等,所以我不知道什么时候将它放在csv文件中,如min;清单完成时间是什么时候?

第一次尝试:

dict_rows = {} 
frames = [] 
lines = (line.strip() for line in open(csvFile)) 
reader = csv.reader(lines, delimiter='\t', quoting=csv.QUOTE_NONE) 
i = 0 
for rec in reader: 
    #print rec 
    dict_rows[i] = (rec[1],rec[5]) 
    i += 1 


## for key in dict_rows[1]: 
##  if dict_rows[key]>max: 
##   max = d[key] 


##  if d[1] == d[1]: 
##   print d 
##   print "equal" 
    print dict_rows 

max_value = max(dict_rows.values()) 
min_value = min(dict_rows.values()) 
print max_value 
print min_value 

这似乎更接近,但:

prev_line = None 
lines = (line.strip() for line in open(csvFile)) 
## for line in lines: 
##  print prev_line,line 
##  prev_line = line 
reader = csv.reader(lines, delimiter='\t', quoting=csv.QUOTE_NONE) 
i = 1 
frames = [] 
x = bool 
for line in reader: 
    print '%s) %s ' %(i,line) 
    #print 'Previous: %s \n Current: %s' %(prev_line, line) 

    #print '%s) %s ' %(prev_line,line) 
##  if i == 1: 
##   print 'First line header' 
##   next_line = reader.next() 
    if prev_line != None: 
##   if prev_line[1] != line[1]: 
##    print '%i) Does NOT %s != %s ?' %(i, prev_line[1],line[1]) 
      if prev_line[1] == line[1]: 
      print '%i) EQUAL! %s == %s' %(i, prev_line[1],line[1]) 

      num = line[5] 
      frames.append(num) 
      x = True 


     else: 
      print '%i) Does NOT %s != %s ?' %(i, prev_line[1],line[1]) 
      frames = [] 
      x = False 

    prev_line = line 
    if x == True: 
     min_frame = min(frames) 
     max_frame = max(frames) 
    else: 
     min_frame = 0 
     max_frame = 0 
    print min_frame 
    print max_frame 



    else: 
     next_line = reader.next() 
     print 'Next: %s' % next_line[1] 
     print '%i) Does %s == %s == %s ?' %(i, prev_line[1],line[1],next_line[1]) 

     if line[1] != next_line[1]: 
      print '%i) %s != %s' %(i, line[1],next_line[1]) 

     elif line[1] != next_line: 
      print '%i) Does not! %s != %s' %(i, line[1],next_line[1]) 


    i +=1 
+4

请您清理的例子。 –

+0

仍然需要相当多的清理。这相当混乱。 –

回答

0

这工作:

data={} 
with open(fn) as f: 
    reader=csv.reader(f, delimiter='\t', quoting=csv.QUOTE_NONE) 
    header=next(reader) 
    for row in reader: 
     data.setdefault(row[1], []).append(int(row[2])) 

print 'key\tmin\tmax'  
for k in data.keys(): 
    print '{}\t{}\t{}'.format(k, min(data[k]), max(data[k]))  

有了您的数据。例如,打印:

key min max 
bye 2 7 
hi 1 5 
+0

这正是我的想法,但不知道如何实现它谢谢!也为了看看我的劣质尝试,并花时间阅读我正在尝试做什么:)。你在墙上救了我痛苦的几个小时。 – lindzylu

0

也许这样的事情

dict_rows = {} 
lines = (line.strip() for line in open(csvFile)) 
for line in csv.reader(lines, delimiter='\t', quoting=csv.QUOTE_NONE): 
    key = line[1] 
    value = line[5] 
    prev = dict_rows.get(key, (value, value)) 
    dict_rows[key] = (min(prev[0], value), max(prev[1], value)) 
for key, value in dict_rows.items(): 
    print key, value[0], value[1] 
0

使用熊猫。这里有一个样本

import pandas as pd 
df = pd.read_csv(filename) 
df.groupby('field2').agg([np.min, np.max]).to_csv(out_filename) 
相关问题