繁体   English   中英

从公共键上的两个数据帧访问值

[英]access values from two dataframes on common key

这些是我的数据框:

import pandas as pd
from geopy.distance import geodesic

df1 = pd.DataFrame({'name':['a','b','c','d'], 'lat':[37.51, 41.33,37.51, 41.33], 'long':[71.81, 77.89,71.81, 77.89]})

df2 = pd.DataFrame({'id':[1,2], 'loc_a':['a','c'],'loc_z':['b','d']})

我想通过使用来自df1的坐标来计算loc_aloc_z之间的距离,分别对应a, b, c, d值。

过去我使用过这个公式,但我的 LONGITUDE 和 LATITUDE 列将在同一个 dataframe 中。

df2['lat_long_diff'] = df2.apply(lambda x : geodesic((x['LATITUDE_first'],x['LONGITUDE_first']),(x['LATITUDE_second'],x['LONGITUDE_second'])).miles,axis=1)

在这种情况下,我希望 LATITUDE 和 LONGITUDE 应该取自 df1

Output:

df2

id    loc_a     loc_z       lat_long_diff
1      a          b        "value in miles"
2      c          d        "value in miles"

先使用DataFrame.merge然后apply

df2 = df2.merge(df1.add_suffix('1').rename(columns={'name1':'loc_a'}), on='loc_a', how='left') 
df2 = df2.merge(df1.add_suffix('2').rename(columns={'name2':'loc_z'}), on='loc_z', how='left') 
print (df2)
   id loc_a loc_z   lat1  long1   lat2  long2
0   1     a     b  37.51  71.81  41.33  77.89
1   2     c     d  37.51  71.81  41.33  77.89

df2['lat_long_diff'] = df2.apply(lambda x : geodesic((x['lat1'],x['long1']),(x['lat2'],x['long2'])).miles,axis=1)

加入两个数据框,然后您可以应用您的公式。

您可以 map df2中的标签(a, b, c, d)及其各自的坐标(lat, long)df1开始,然后使用.apply计算距离。:

mapping = df1.set_index('name').agg(tuple, axis=1)
coords = df2[['loc_a', 'loc_z']].transform(lambda s: s.map(mapping))
df2['lat_long_diff'] = coords.apply(lambda x : geodesic(x['loc_a'], x['loc_z']).miles, axis=1)

中间步骤:

# print(mapping)
name
a    (37.51, 71.81)
b    (41.33, 77.89)
c    (37.51, 71.81)
d    (41.33, 77.89)
dtype: object

# print(coords)
            loc_a           loc_z
0  (37.51, 71.81)  (41.33, 77.89)
1  (37.51, 71.81)  (41.33, 77.89)

结果:

# print(df2)
  id loc_a loc_z  lat_long_diff
0   1     a     b     418.480212
1   2     c     d     418.480212

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM