熊猫:垂直查找两个数据帧

时间:2017-02-01 12:02:54

标签: python pandas dataframe mapping vlookup

我有一个坐标值的数据框df1,如下所示:

    lat         lon         E               N
0   48.010258   -6.156909   90089.518711    -201738.245555
1   48.021648   -6.105887   93961.324059    -200676.766517
2   48.033028   -6.054801   97836.321204    -199614.270439
... ...         ...         ...             ...

和另一个数据框df2将气候值与每个(lat,lon)对相关联:

    lat         lon        val
0   48.010258   -6.156909  17.11
1   48.021648   -6.105887  22.23
2   48.033028   -6.054801  39.86
... ...         ...        ...

我想创建一个新列df1['corr_pos'],其中每一行的df2索引对应{{1>中的(lat,lon)对}}。这就像在Excel中使用 VLOOKUP ,但使用两个值来标识正确的索引而不是仅使用一个。这两个值是坐标对。

输出结果为:

df1

数据框 lat lon E N corr_pos 0 48.010258 -6.156909 90089.518711 -201738.245555 0 1 48.021648 -6.105887 93961.324059 -200676.766517 3 2 48.033028 -6.054801 97836.321204 -199614.270439 8 ... ... ... ... ... ... df1 没有具有相同的顺序。 我怎么能在熊猫中实现这个?

1 个答案:

答案 0 :(得分:1)

我认为您需要mergereset_index一起创建index的新列:

print (df2)
          lat       lon    val
7   48.010258 -6.156909  17.11
10  48.021648 -6.105887  22.23
12  48.033028 -6.054801  39.86
df = pd.merge(df1, 
              df2.reset_index().drop('val', axis=1).rename(columns={'index':'corr_pos'}), 
              on=['lat','lon'], 
              how='left')
print (df)
         lat       lon             E              N  corr_pos
0  48.010258 -6.156909  90089.518711 -201738.245555         7
1  48.021648 -6.105887  93961.324059 -200676.766517        10
2  48.033028 -6.054801  97836.321204 -199614.270439        12

如果df2有很多列,最好使用子集,因为合并会删除它们:

df = pd.merge(df1, 
              df2.reset_index()[['lat','lon', 'index']].rename(columns={'index':'corr_pos'}),
              on=['lat','lon'], 
              how='left')
print (df)
         lat       lon             E              N  corr_pos
0  48.010258 -6.156909  90089.518711 -201738.245555         7
1  48.021648 -6.105887  93961.324059 -200676.766517        10
2  48.033028 -6.054801  97836.321204 -199614.270439        12