比较csv中的行向前循环并根据它们的共同值向后调整它们

时间:2017-11-04 19:41:40

标签: python-3.x loops csv next

python中的新功能,但我发现没有线程解决我的问题。

我有一大堆我正在进行后期处理的数据,它已存储在已经组织为字典的csv文件中。每个数据表示地图中的一个点,如果点在某个范围内,则该点从唯一点(质心)收集。有一个可能的质心列表及其坐标,其中质心始终遵循相同的顺序。在某些情况下,几个质心位于相同点的范围(50),所以我试图估计哪个是质心,它收集了每个点。以下代码成功计算了每个数据范围内的质心。

coordinates = ["41.49770104,-0.138334713","40.91960027,-1.841980944","40.86344385,-0.723219273"] #3 centroids as example

with io.open("Trips.csv", mode='r', encoding='latin-1') as csvfile:
            reader = csv.reader(csvfile,  delimiter=",", quotechar="\"", quoting=csv.QUOTE_ALL,dialect="excel")
            for i, row in enumerate(reader):
                label = ["Clat","Clong","Cradius"] #Centroid coordinates and distance to current dot
                result = []
                finalresult = []
                newlines = []

                if i != 0: #For avoiding 1st row (header)
                    for centroid in coordinates:
                        latitude = float(centroid.split(',')[0])
                        longitude = float(centroid.split(',')[1])
                        radius = haversine(longitude, latitude, float(row[12]), float(row[11])) #Formula not relevant for this case.Distance between points. Type: Float

                        if radius < 50: #Condition to consider a centroid
                            result = [latitude,longitude,radius]
                            a = dict(zip(label,result))
                            finalresult.append(a)
                        else:
                            continue

                    newlines = [row, finalresult] #New datum including possible centroids per datum

由于具有质心的列表始终遵循相同的顺序,并且该顺序用于收集数据,我的想法是找到只有1个可能的质心的数据。然后,如果下面有几个可能的质心,那么从那一行向前移动,并且它们中的任何一个等于前一个,那么一个将是正确的。如果没有,那么如果可用,将选择列表中的以下质心,依此类推。同样的过程倒退了。

但是,由于我没有立即读取所有数据框(如在循环中),我看不到比较行的方法并应用此条件。由于数据库非常大,因此创建具有质心结果的新csv文件是不可行的。有没有办法比较两行包括上述算法?我查看了itertools和函数next(),但后者在这种情况下不起作用:(“TypeError:'list'对象不是迭代器”)。考虑具有2个质心的行:

                        if len(newlines[1]) == 1: #Only 1 suitable centroid
                        print(centroid)
                    else: #Several available centroids
                        finalresult2=[]
                        for centroid in coordinates:
                            latitude = float(centroid.split(',')[0])
                            longitude = float(centroid.split(',')[1])
                            radius = haversine(longitude, latitude, float(next(row)[12]), float(next(row)[11])) #next row
                            if radius < 50:
                                result = [latitude, longitude, radius]
                                b = dict(zip(label, result))
                                finalresult2.append(b)
                            else:
                                continue
                        nextline = [row, finalresult2] #next row'results

                        for c in finalresult: #Check if the common value
                            if c in finalresult2:
                                print(c) #Take the common value and apply it to the previous row

为什么下一个不能适用于此列表?如果下面的行与它们有共同的值,是否有任何方法可以在循环编辑行中向后播放?

0 个答案:

没有答案