从另一个CSV中删除与行相同的行

时间:2015-10-15 18:33:32

标签: python numpy rows

我试图遍历2个CSV文件的每一行。如果两个文件中都有相同的lat和lon字段,我想丢弃这一行。

我已尝试过以下

import numpy
f=numpy.genfromtxt('/wind/addandclaimwithinlatlon.csv', delimiter=',', 
                   dtype=None, skiprows=0)
f1=numpy.genfromtxt('/wind/new_2011.csv',delimiter=",",dtype=None,skiprows=0)
final=[]
for row in f:
    for row1 in f1:
        if row[1]==row1[0] and row[2]==row1[1]:
            print "duplicates"
        else:
            final.append([row[0],row[1],row[2]])

numpy.savetxt('/wind/addclaimwithinlatlonwithout2011.csv',
               final, delimiter=',', fmt='%s')  

它不会失败,但它只运行很长时间并且不会产生任何输出。有什么问题?有没有其他方法可以更快地完成这项工作?

2 个答案:

答案 0 :(得分:1)

由于您的文件已成功加载,因此问题似乎与您的代码有关。

因此,您可以使用itertools.zip_longest(在python 2.X izip_longest中)压缩文件,然后使用列表推导来保留预期的行,而不是多个索引和嵌套循环。

from itertools import zip_longest
import numpy
f=numpy.genfromtxt('/wind/addandclaimwithinlatlon.csv',delimiter=",",dtype=None,skiprows=0)
f1=numpy.genfromtxt('/wind/new_2011.csv',delimiter=",",dtype=None,skiprows=0)
final=[row for row,row1 in zip_longest(f,f1) if len(row)>3 and len(row1)>1 and row[1:3]!=row1[:2]]

请注意,您可以使用一个切片,而不是使用多个索引来比较row[1],row[2]row1[0],row[1]

答案 1 :(得分:0)

导入numpy 来自itertools import izip_longest F = numpy.genfromtxt( '/风/ addandclaimwithinlatlon.csv',分隔符= “”,D型细胞=无,skiprows = 0) F1 = numpy.genfromtxt( '/风/ new_2011.csv',分隔符= “”,D型细胞=无,skiprows = 0) 最后= [] 对于行,izip_longest中的row1(f,f1):     ROW2 =名单(行)     #LAT = ROW2 [1]     #LON = ROW2 [2]     如果row2 [1:3] .all()== row1 [:2] .all():         打印“dup”     其他:         final.append(行)

numpy.savetxt('/ wind / addclaimwithinlatlonwithout2011.csv',final,delimiter =“,”,fmt ='%s')

现在仍在使用。错误。 List对象没有属性'all' 即使我将每个列分配为不同的变量,它也表示非类型对象不是可订阅的