我想为df1中与df2中的一行具有相同纬度和经度的行分配df2的“ ID”,或者根据max_lat_offset
和max_lon_offset
使其足够接近。
这个for循环版本可以满足我的要求,但是对于大型数据集来说很慢:
for df1_index, df1_row in df1.iterrows():
for df2_index, df2_row in df_2.iterrows():
if abs(df2_row['latitude'] - df1_row['lat']) < max_lat_offset and abs(df2_row['longitude'] - df1_row['lon']) < max_lon_offset:
df1.at[df1_index,'id'] = df2_row['ID']
是否可以使用聪明的pandas / numpy技巧来解决?我尝试使用np.where
df1['id'] = np.where(abs(df2.latitude - df1.lat) < max_lat_offset and abs(df2.longitude - df1.lon) < max_lon_offset, df2['ID'], None)
但是我得到ValueError: The truth value of a Series is ambiguous
。
熊猫专家,做这件事的最佳方法是什么?
更新-这是df中数据的外观:
df1:
lat lon id
0 53.045913 -1.410764 NaN
1 57.148783 -6.211683 NaN
2 51.421184 0.824588 NaN
3 51.504658 -0.104954 NaN
4 51.464968 -0.073252 NaN
df2:
latitude longitude ID
0 51.387471 -3.406610 1
1 55.735807 -4.888574 2
2 53.716417 -1.281885 3
3 52.448628 0.725273 4
4 52.230195 -0.881341 5
预期输出为df1,并对其进行了修改,以使id
的行的df2 ID
值具有足够接近的纬度和经度。
答案 0 :(得分:0)
您可以尝试
df1['id'] = np.where((abs(df2.latitude - df1.lat) < max_lat_offset) &
(abs(df2.longitude - df1.lon) < max_lon_offset), df2['ID'], None)
答案 1 :(得分:0)
一种可能的解决方案是对新DataFrame
中的值的所有组合使用交叉联接,然后可以按条件进行过滤-但是如果大型DataFrame需要大量RAM:
df = df1.assign(a=1).merge(df2.assign(a=1), on='a')
df = df[((df.latitude - df.lat).abs() < max_lat_offset) &
((df.longitude - df.lon).abs() < max_lon_offset)]