【问题标题】:Cannot perform task in python loop无法在 python 循环中执行任务
【发布时间】:2013-07-13 14:38:12
【问题描述】:

我正在通过日期和位置代码匹配两个 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 (lb) 中的记录匹配的所有记录的第二个 csv (vms) 创建一个子集数组。这是我正在使用的代码:

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 列表。但它仍然不起作用,列表为空。是否有某种我没有看到的锁?有没有其他方法可以做我想做的事情?

【问题讨论】:

  • 我建议在您对某些变量的状态有一定期望的地方添加一些调试输出。 log 是你期望的样子吗?
  • 哇。我不知道这次为什么会这样,因为我发誓我在发布之前尝试过解决这个问题。只需在代码行后添加“print vms_list”,脚本就可以正常工作。我猜出于某种原因 vms_list 没有完全存储或类似的东西。
  • @AlmaThom 您可以发布您的发现作为答案...

标签: python loops csv python-2.7 numpy


【解决方案1】:

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

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)

【讨论】:

    猜你喜欢
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多