【发布时间】:2017-07-06 12:08:01
【问题描述】:
我有一个函数正在尝试应用于位置数据框。具体来说,我想添加一个新列,其中包含与每个站点最近的 10 个站点。以下似乎有效,但速度非常慢。
def distance(first_lat, first_lon, second_lat, second_lon):
return ((first_lat - second_lat) ** 2 + (first_lon - second_lon) ** 2) ** 0.5
def load_site_list():
'''
This function generates a dataframe with all the available sites
'''
url = 'ftp://ftp.ncdc.noaa.gov/pub/data/noaa/isd-history.csv'
cols = ["STATION NAME",
"LAT",
"LON"]
df = pd.read_csv(url, parse_dates=False, usecols=cols)
df = df.dropna(subset=['LAT'])
df = df.dropna(subset=['LON'])
df['LAT'] = df['LAT'].astype(float)
df['LON'] = df['LON'].astype(float)
return df
sites = load_site_list()
sites['closest'] = ""
for index, row in sites.iterrows():
sites['dist'] = sites.apply(lambda line: distance(line['LAT'], line['LON'], row['LAT'], row['LON']), axis=1)
sites.sort_values('dist', inplace=True)
sites['closest'][index] = sites['STATION NAME'].iloc[1:11].tolist()
似乎 for 循环中生成与当前列的距离的第一行在每个循环中占用了第二个。这里有超过 10,000 行要循环...有没有更快的方法?
【问题讨论】:
-
您是否考虑过使用KDTree 方法?
-
尝试将您的
sites数据帧作为一个 numpy 数组(或多个数组),然后在最后创建数据帧。 see another so answer here -
你可以使用更快捷的github.com/jmcarpenter2/swifter