Vij*_*jay 5 python numpy pandas
我有2套地理代码作为熊猫系列,我试图找到从集合B中的点获得集合A中的点的最小欧氏距离的最快方法.即:距离最近点40.748043和-73.992953第二集,依此类推.非常感谢任何建议/帮助.
Set A:
print(latitude1)
print(longitude1)
0 40.748043
1 42.361016
Name: latitude, dtype: float64
0 -73.992953
1 -71.020005
Name: longitude, dtype: float64
Set B:
print(latitude2)
print(longitude2)
0 42.50729
1 42.50779
2 25.56473
3 25.78953
4 25.33132
5 25.06570
6 25.59246
7 25.61955
8 25.33737
9 24.11028
Name: latitude, dtype: float64
0 1.53414
1 1.52109
2 55.55517
3 55.94320
4 56.34199
5 55.17128
6 56.26176
7 56.27291
8 55.41206
9 52.73056
Name: longitude, dtype: float64
Run Code Online (Sandbox Code Playgroud)
这是仅使用numpy.linalg.norm.
import pandas as pd, numpy as np
df1['coords1'] = list(zip(df1['latitude1'], df1['longitude1']))
df2['coords2'] = list(zip(df2['latitude2'], df2['longitude2']))
def calc_min(x):
amin = np.argmin([np.linalg.norm(np.array(x)-np.array(y)) for y in df2['coords2']])
return df2['coords2'].iloc[amin]
df1['closest'] = df1['coords1'].map(calc_min)
# latitude1 longitude1 coords1 closest
# 0 40.748043 -73.992953 (40.748043, -73.992953) (42.50779, 1.52109)
# 1 42.361016 -71.020005 (42.361016, -71.020005) (42.50779, 1.52109)
# 2 25.361016 54.000000 (25.361016, 54.0) (25.0657, 55.17128)
Run Code Online (Sandbox Code Playgroud)
设置
from io import StringIO
mystr1 = """latitude1|longitude1
40.748043|-73.992953
42.361016|-71.020005
25.361016|54.0000
"""
mystr2 = """latitude2|longitude2
42.50729|1.53414
42.50779|1.52109
25.56473|55.55517
25.78953|55.94320
25.33132|56.34199
25.06570|55.17128
25.59246|56.26176
25.61955|56.27291
25.33737|55.41206
24.11028|52.73056"""
df1 = pd.read_csv(StringIO(mystr1), sep='|')
df2 = pd.read_csv(StringIO(mystr2), sep='|')
Run Code Online (Sandbox Code Playgroud)
如果性能是一个问题,您可以通过底层 numpy 数组相当轻松地矢量化此计算。
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |