Python 熊猫:使用两个数据帧进行垂直查找
我有一个坐标值的数据框,如下所示:Python 熊猫:使用两个数据帧进行垂直查找,python,pandas,dataframe,mapping,vlookup,Python,Pandas,Dataframe,Mapping,Vlookup,我有一个坐标值的数据框,如下所示: 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 ... ...
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,它将气候值与每个(纬度、经度)对相关联:
我想创建一个新列,df1['corr_pos']
,其中每一行都有df2
的索引,对应于df1
中的(lat,lon)对。这就像在Excel中使用VLOOKUP一样,但是使用两个值来标识正确的索引,而不是只使用一个。这两个值是坐标对
产出将是:
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
和df2
的顺序不同我如何在熊猫中实现这一点?我认为您需要使用从索引创建一个新列:
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
有许多列,最好使用subset,因为merge将删除它们:
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
@谢谢。如果我想将corr\u pos
列添加到df1
,而不是创建新的数据帧,该怎么办?当然,我不想丢失通信。嗯,有一个问题,您需要通过2列
连接,因此无法使用。我不知道没有merge
是可能的,也许join
-所有方法都返回新的数据帧..但是我可以创建一个新的df
,然后使用map
将新列添加到df1
。是的,但是map需要一个列映射到另一个值。如果选中参数上的中只有一列,则可以使用map
。但如果在=['val1','val2',…]上有多个as 1连接列on
,则map
解决方案是不可能的。
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