簡體   English   中英

根據兩個數據框的比較更新熊貓列

[英]Update pandas column based on comparison of two dataframes

我想為 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']

是否可以使用聰明的熊貓/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM