[英]Update pandas column based on comparison of two dataframes
我想為 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']
是否可以使用聰明的熊貓/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
值。
你可以試試這個
df1['id'] = np.where((abs(df2.latitude - df1.lat) < max_lat_offset) &
(abs(df2.longitude - df1.lon) < max_lon_offset), df2['ID'], None)
一種可能的解決方案是對 new 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)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.