2016-08-21 44 views
2

在下面的代碼中,數據幀df5未被填充。我只是將值分配給數據框的列,並且我已經預先指定了列。當我打印數據框時,它返回一個空的數據框。不知道我是否錯過了一些東西。爲數據幀列分配值

任何幫助,將不勝感激。

import math  
import pandas as pd 

columns = ['ClosestLat','ClosestLong'] 

df5 = pd.DataFrame(columns=columns) 

def distance(pt1, pt2): 
    return math.sqrt((pt1[0] - pt2[0])**2 + (pt1[1] - pt2[1])**2) 

for pt1 in df1: 
    closestPoints = [pt1, df2[0]] 
    for pt2 in df2: 
    if distance(pt1, pt2) < distance(closestPoints[0], closestPoints[1]): 
     closestPoints = [pt1, pt2] 
     df5['ClosestLat'] = closestPoints[1][0] 
    df5['ClosestLat'] = closestPoints[1][0] 
    df5['ClosestLong'] = closestPoints[1][1] 
    print ("Point: " + str(closestPoints[0]) + " is closest to " + str(closestPoints[1])) 
+0

請定義df1和df2。 – bpachev

回答

1

從你的代碼的樣子,你想填充df5與緯度和經度的列表。但是,你犯了一些錯誤。

  1. 熊貓數據框的列是系列,並保存某種類型的順序數據。所以df5['ClosestLat'] = closestPoints[1][0]試圖分配整列一個單一的數值,並導致一個空的列。
  2. 即使數據幀並未忽略嘗試將實數賦給列的操作,也會因爲每個循環覆蓋列而丟失數據。

解決方案:建立lats和longs列表,然後插入數據框。

import math  
import pandas as pd 

columns = ['ClosestLat','ClosestLong'] 

df5 = pd.DataFrame(columns=columns) 

def distance(pt1, pt2): 
    return math.sqrt((pt1[0] - pt2[0])**2 + (pt1[1] - pt2[1])**2) 

lats, lngs = [], [] 
for pt1 in df1: 
    closestPoints = [pt1, df2[0]] 
    for pt2 in df2: 
    if distance(pt1, pt2) < distance(closestPoints[0], closestPoints[1]): 
     closestPoints = [pt1, pt2] 
    lats.append(closestPoints[1][0]) 
    lngs.append(closestPoints[1][1]) 

df['ClosestLat'] = pd.Series(lats) 
df['ClosestLong'] = pd.Series(lngs) 
+0

謝謝。它完美的作品。 – user3447653