![](/img/trans.png)
[英]Extract from dataframe rows based on common values between two dataframes
[英]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_a
和loc_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.