2016-08-21 66 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