我通过日期和位置代码匹配来自两个csv文件的ID字段,两个文件看起来都是这样(当然使用不同的ID):
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[ np.logical_and(vms['date']==log[0]['date'] , vms['code']==log[0]['code'] )]
未正确运行,因为vms_list为空,稍后会在行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中一行的条件匹配的ID列表。但它仍然不起作用,列表为空。我有没有看到某种锁?是否有不同的方式来做我想做的事情?
答案 0 :(得分: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)