嵌套for循环只运行一次

时间:2018-02-13 19:59:40

标签: python pandas for-loop dataframe nested-loops

我试图在python中运行最近邻居排序。我有一个充满点的dataFrame,例如:

       x      y
1     10   10.0
2     26   11.0
3     27   20.0
4     36   19.0
...

高达1000分。我试图通过与dataFrame中任何未使用的点的最短距离对这些点进行排序。我目前用于执行此操作的代码如下所示。

for j in range(0, len(data)-2):
    minDist = 1000000
    k = j+1
    for i in range(k, len(data)-1):
        #dist1 = distance.euclidean(j, i+1)
        dist2 = distance.euclidean(j, i)

        if(dist2<minDist):
            minDist = dist2
            print(minDist)
            minI = data.iloc[i]

    b, c = data.iloc[j+1].copy(), data.iloc[i].copy()
    data.iloc[j+1],data.iloc[i] = c, b

但是,当我运行此代码时,我的输出数据文件只移动一个数据点,并且它不是正确的数据点,如下所示:

         x      y
1     10.0   10.0
2    624.0  436.0
3     26.0   11.0
4     27.0   20.0

我认为嵌套for循环存在一些问题,但我不确定。我的for循环有任何错误吗?或者这只是我在Python中如何解决问题的一个问题?

2 个答案:

答案 0 :(得分:0)

如果你试图嵌套for循环,那么你做错了,因为第一个for循环使用的缩进是不正确的。要嵌套它们,你必须做这样的事情:

for j in range(0, len(data)-2):
    minDist = 1000000
    k = j+1
    for i in range(k, len(data)-1):
        #dist1 = distance.euclidean(j, i+1)
        dist2 = distance.euclidean(j, i)

        if(dist2<minDist):
            minDist = dist2
            print(minDist)
            minI = data.iloc[i]

    b, c = data.iloc[j+1].copy(), data.iloc[i].copy()
    data.iloc[j+1],data.iloc[i] = c, b

答案 1 :(得分:0)

解决问题的方法:

第二个循环没有针对第一个循环进行迭代,因此添加了“k = j + 1”行。

还添加了minDist = 10000000,以确保第一次比较正确并且没有跳过初始点。

for j in range(0, len(data)-1):
minDist = 1000000
k = j+1
for i in range(k, len(data)):
    #dist1 = distance.euclidean(j, i+1)
    dist2 = distance.euclidean(data.iloc[j], data.iloc[i])

    if(dist2<minDist):
        minDist = dist2
        #print(minDist)
        minI = i

b, c = data.iloc[j+1].copy(), data.iloc[minI].copy()
data.iloc[j+1],data.iloc[minI] = c, b