根据两个数据框的比较更新熊猫列

时间:2019-12-03 09:59:41

标签: python pandas numpy

我想为df1中与df2中的一行具有相同纬度和经度的行分配df2的“ ID”,或者根据max_lat_offsetmax_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值具有足够接近的纬度和经度。

2 个答案:

答案 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)]