将嵌套 for 循环的最小值保存到 Pandas Dataframe
Save the minimum value of a nested for loop to Pandas Dataframe
我正在尝试计算从 Dataframe 中一列的每个点(坐标)到另一个 Dataframe 中另一列的每个点(坐标)的距离,并保存到 Dataframe 的最小距离,这样得到的 Dataframe与第一列的长度相同。
数据:
实习生:
ID
coordinates
1
(50.939266, 6.934996)
2
(50.935998, 6.931481)
360 个条目
停靠点:
Name
coordinates
A
(50.93576, 6.96046)
B
(50.9357, 6.95957)
2082 个条目
期望的结果:
ID
coordinates
min_distance
1
(50.939266, 6.934996)
1.8263939732112
2
(50.935998, 6.931481)
0.3
intern:3 列,每列 360 个条目,其中最后一列是第二列中的坐标与停靠点 Dataframe 的每个坐标的最小距离
我试过:
intern_index = 0
stops_index = 0
min_distance = 99999
hs.haversine((50.939266, 6.934996), (50.93576, 6.96046), unit=Unit.KILOMETERS)
Out: 1.8263939732112031
for i in intern['coordinates']:
for j in stops['coordinates']:
new_distance = hs.haversine(i, j, unit=Unit.KILOMETERS)
if new_distance < new_distance:
min_distance = new_distance
intern['min_distance'] = min_distance
这产生:
ID
coordinates
min_distance
1
(50.939266, 6.934996)
22.941973
2
(50.935998, 6.931481)
22.941973
为什么没有保存正确的值?即使是第一次尝试也小于这个值,它也不能都是相同的距离
我建议以矢量化形式实现您想要的,因为它要快得多。 Numpy 在您需要的那种计算方面非常高效。
正在初始化一些测试数据:
df_1 = pd.DataFrame({"ID": [1, 2],
"coordinates": [(1.0, 0.0), (-0.5, 0.0)]})
df_1.set_index("ID", inplace=True)
df_2 = pd.DataFrame({"Name": ["A", "B", "C"],
"coordinates": [(1.0, 0.0), (0.0, 0.0), (-1.0, 0.0)]})
df_2.set_index("Name", inplace=True)
在 的帮助下,在两个输入集合的每一对之间编写向量化版本的 haversine 距离计算:
def haversine(df_1, df_2):
np_1 = np.array(df_1['coordinates'].tolist())
np_2 = np.array(df_2['coordinates'].tolist())
np_1 = np.deg2rad(np_1)
np_2 = np.deg2rad(np_2)
diff_lat = np_1[:, 0, None] - np_2[:, 0]
diff_lng = np_1[:, 1, None] - np_2[:, 1]
d = np.sin(diff_lat/2)**2 + np.cos(np_1[:, 0, None])*np.cos(np_2[:, 0]) * np.sin(diff_lng/2)**2
return 2 * 6371 * np.arcsin(np.sqrt(d))
正在申请:
df_1["min_haversine_dist"] = np.min(haversine(df_1, df_2), axis=1)
df_1.head()
Returns:
ID, coordinates, min_haversine_dist
1 (1.0, 0.0) 0.000000
2 (-0.5, 0.0) 55.597463
注意。我个人的经验法则:如果我在 dataFrame 上循环,我做错了什么,如果我在 dataFrame 中的记录上有一个嵌套循环,我我做错了。
我正在尝试计算从 Dataframe 中一列的每个点(坐标)到另一个 Dataframe 中另一列的每个点(坐标)的距离,并保存到 Dataframe 的最小距离,这样得到的 Dataframe与第一列的长度相同。 数据: 实习生:
ID | coordinates |
---|---|
1 | (50.939266, 6.934996) |
2 | (50.935998, 6.931481) |
360 个条目
停靠点:
Name | coordinates |
---|---|
A | (50.93576, 6.96046) |
B | (50.9357, 6.95957) |
2082 个条目
期望的结果:
ID | coordinates | min_distance |
---|---|---|
1 | (50.939266, 6.934996) | 1.8263939732112 |
2 | (50.935998, 6.931481) | 0.3 |
intern:3 列,每列 360 个条目,其中最后一列是第二列中的坐标与停靠点 Dataframe 的每个坐标的最小距离
我试过:
intern_index = 0
stops_index = 0
min_distance = 99999
hs.haversine((50.939266, 6.934996), (50.93576, 6.96046), unit=Unit.KILOMETERS)
Out: 1.8263939732112031
for i in intern['coordinates']:
for j in stops['coordinates']:
new_distance = hs.haversine(i, j, unit=Unit.KILOMETERS)
if new_distance < new_distance:
min_distance = new_distance
intern['min_distance'] = min_distance
这产生:
ID | coordinates | min_distance |
---|---|---|
1 | (50.939266, 6.934996) | 22.941973 |
2 | (50.935998, 6.931481) | 22.941973 |
为什么没有保存正确的值?即使是第一次尝试也小于这个值,它也不能都是相同的距离
我建议以矢量化形式实现您想要的,因为它要快得多。 Numpy 在您需要的那种计算方面非常高效。
正在初始化一些测试数据:
df_1 = pd.DataFrame({"ID": [1, 2],
"coordinates": [(1.0, 0.0), (-0.5, 0.0)]})
df_1.set_index("ID", inplace=True)
df_2 = pd.DataFrame({"Name": ["A", "B", "C"],
"coordinates": [(1.0, 0.0), (0.0, 0.0), (-1.0, 0.0)]})
df_2.set_index("Name", inplace=True)
在
def haversine(df_1, df_2):
np_1 = np.array(df_1['coordinates'].tolist())
np_2 = np.array(df_2['coordinates'].tolist())
np_1 = np.deg2rad(np_1)
np_2 = np.deg2rad(np_2)
diff_lat = np_1[:, 0, None] - np_2[:, 0]
diff_lng = np_1[:, 1, None] - np_2[:, 1]
d = np.sin(diff_lat/2)**2 + np.cos(np_1[:, 0, None])*np.cos(np_2[:, 0]) * np.sin(diff_lng/2)**2
return 2 * 6371 * np.arcsin(np.sqrt(d))
正在申请:
df_1["min_haversine_dist"] = np.min(haversine(df_1, df_2), axis=1)
df_1.head()
Returns:
ID, coordinates, min_haversine_dist
1 (1.0, 0.0) 0.000000
2 (-0.5, 0.0) 55.597463
注意。我个人的经验法则:如果我在 dataFrame 上循环,我做错了什么,如果我在 dataFrame 中的记录上有一个嵌套循环,我我做错了。