2013-07-15 61 views
0

我按日期和地点代码匹配来自两个CSV文件ID字段,这两个文件看起来像这样(用不同的ID,当然):不能在Python循环执行任务

ID code date 
543 452 '1/4/2009' 
543 452 '1/8/2009' 
543 452 '2/1/2009' 
543 452 '2/14/2009' 
543 452 '3/6/2009' 
543 452 '3/9/2009' 
874 210 '1/4/2009' 
874 210 '1/9/2009' 
874 210 '1/24/2009' 
874 210 '2/7/2009' 

我加载这些作为numpy数组,然后遍历,但是我无法在循环中执行某个任务。我需要从我的第二个csv(vms)创建一个与第一个csv(lb)中的记录相匹配的记录的子集数组。这里是我一起工作的代码:

import numpy as np 
from collections import defaultdict 

lb = np.genfromtxt('file2009.csv',dtype = None, delimiter = ',', names = True) 
vms = np.genfromtxt('2009final.csv',dtype = None, delimiter = ',', names = True) 

id_list = list(set(lb['ID'])) 

matchList = defaultdict(list) 

for e in id_list: 
    log = lb[lb['ID']==e] 
    vms_list = vms[ np.logical_and(vms['date']==log[0]['date'] , vms['code']==log[0]['code'])] 
    vms_id_list = list(set(vms_list['ID'])) 
    for row in log: 
     if len(vms_id_list) == 1: 
      break 
     else: 
      vmsIDs = vms[vms['ID'] == vms_id_list[0]] 
      vms_ids = str(vms_id_list) 
      for every in vms: 
       if str(every['ID']) in vms_ids: 
        vmsIDs = np.hstack([vmsIDs, every]) 
      vms_id_list = [] 
      vms_list = vmsIDs[ np.logical_and(vmsIDs['date']==row['date'] , vmsIDs['code']==row['code'])] 
      vms_id_list = list(set(vms_list['ID'])) 
    matchList[e].append(vms_id_list) 

当我运行的代码,没有错误是从它向外扩张,但它是很清楚,行:为vms_list是空
vms_list = vms[ np.logical_and(vms['date']==log[0]['date'] , vms['code']==log[0]['code'])]
未正确运行这会在线路vmsIDs = vms[vms['ID'] == vms_id_list[0]]后面生成错误。 我真的很困惑,因为列表已创建,它只是完全空白,即使我知道有许多记录符合条件。
如果我简单地将代码行从循环中复制出来并单独运行,它可以正常工作,所以问题在于它在循环中执行。我不知道为什么这是行不通的,我甚至试图从numpy的logical_and改变语言:

for e in id_list: 
    log = lb[lb['ID']==e] 
    for each in vms: 
     if each['date'] == log[0]['date'] and each['code'] == log[0]['code']: 
      vms_id_list.append(each['ID']) 

但它不工作,该列表是空的。这一步的整个要点是从vms获得符合lb行标准的列表,但它仍然无效,列表为空。有没有我没有看到的某种锁?有没有不同的方式来做我想做的事情?

+1

我会建议在某些地方对某些变量的状态有一定的期望的地方增加一些调试输出。是否“日志”如何你会期望它? –

+0

哇。我不知道这次为什么会这样,因为我发誓我在发帖之前试着用这个方法解决问题。通过在代码行后面简单添加'print vms_list',脚本实际上可以工作。无论出于什么原因,我猜vms_list没有完全存储或类似的东西。 – AlmaThom

+0

@AlmaThom你可以发表你的发现作为答案... –

回答

0

正如评论部分所述,无论出于何种原因,此代码只是不正确地存储我的列表,但当提示打印列表时,它将被存储并且脚本正确运行。这里是完成的脚本:

import numpy as np 
from collections import defaultdict 

lb = np.genfromtxt('file2009.csv',dtype = None, delimiter = ',', names = True) 
vms = np.genfromtxt('2009final.csv',dtype = None, delimiter = ',', names = True) 

id_list = list(set(lb['ID'])) 

matchList = defaultdict(list) 

for e in id_list: 
    log = lb[lb['ID']==e] 
    vms_list = vms[ np.logical_and(vms['date']==log[0]['date'] , vms['code']==log[0]['code'])] 
    print vms_list 
    vms_id_list = list(set(vms_list['ID'])) 
    for row in log: 
     if len(vms_id_list) == 1: 
      break 
     else: 
      vmsIDs = vms[vms['ID'] == vms_id_list[0]] 
      vms_ids = str(vms_id_list) 
      for every in vms: 
       if str(every['ID']) in vms_ids: 
        vmsIDs = np.hstack([vmsIDs, every]) 
      vms_id_list = [] 
      vms_list = vmsIDs[ np.logical_and(vmsIDs['date']==row['date'] , vmsIDs['code']==row['code'])] 
      vms_id_list = list(set(vms_list['ID'])) 
    matchList[e].append(vms_id_list)