在python中定位两条轨迹的交点

在python中定位两条轨迹的交点,python,pandas,dataframe,Python,Pandas,Dataframe,我试图找到两条飞行轨迹的交点,一旦找到了交点,我需要两条轨迹在交点处的指数。我为此编写了以下代码(针对一对航班,fa和fb)- 这在计算上是非常昂贵的(计算这一点几乎需要20秒),而且当我有数百个飞行对时,这将花费很多时间。我相信会有更快的方法来做到这一点,我真的非常感谢在这方面的投入 这两个数据帧具有相同的以下结构- fa = pd.DataFrame([[14:07:05, 106.535, 2.524], [14:07:10, 106.525,2.526]], columns=['time

我试图找到两条飞行轨迹的交点,一旦找到了交点,我需要两条轨迹在交点处的指数。我为此编写了以下代码(针对一对航班,fa和fb)-

这在计算上是非常昂贵的(计算这一点几乎需要20秒),而且当我有数百个飞行对时,这将花费很多时间。我相信会有更快的方法来做到这一点,我真的非常感谢在这方面的投入

这两个数据帧具有相同的以下结构-

fa = pd.DataFrame([[14:07:05, 106.535, 2.524], [14:07:10, 106.525,2.526]], columns=['time', 'longitude', 'latitude'])
fb = pd.DataFrame([[14:00:05, 107.306, 3.722], [14:00:10, 107.296,3.718]], columns=['time', 'longitude', 'latitude'])

我刚刚包含了两行数据,以便更好地描述这个问题。

我假设fa和fb都是两个df,您需要纬度和经度相等的索引,然后您可以尝试np

fa[match] = np.where((fa['latitude']==fb['latitude'] and fa['longitude']==fb['longitude']), 'True', 'False')

如果两者都匹配,这将插入True,否则为false,然后直接打印匹配为True的那些值

我可以理解为什么算法运行缓慢…本质上,这是一个蛮力搜索,以查看一条飞行路径上的任何点是否与另一条飞行路径匹配。然而,如果存在更有效的方法,为了完全回答您的问题,您可能需要澄清一些假设

例如,您是否假设每架飞机飞行的路径最短(即两点之间的大圆路线),且没有偏差?如果是这样,这里有一个关于如何计算交点的很好的总结-

您可以在其经度和纬度列上显示数据帧:

fa=pd.DataFrame(['14:07:05',106.535,2.524],'14:07:10',106.525,2.526]],列=['time','longitude','latitude'])
fb=pd.DataFrame(['14:00:05',107.306,3.722],'14:00:10',107.296,3.718],'14:07:05',106.535,2.524]],列=['time','longitude','latitude'])
fa.merge(fb,on=[‘经度’、‘纬度’])
给出(注意,我在
fb
中添加了另一个字段以获得匹配)

如果要保留索引,请重置它们(将它们转换为常规列)并使用外部合并,然后删除不匹配的行:

fa.reset_index().merge(fb.reset_index(),on=['longitude','latitude','how='outer')。dropna()
给予


请将您的数据的一小部分作为可复制的代码,用于测试,以及所提供数据的预期输出。请参阅,和。您可以在经度和纬度字段上创建数据帧。这将消除for循环,但它仍然是一个二次增长比较。@JanWilamowski,是的,我尝试过,但如何从中获得两个数据帧的索引?mergedStuff=pd.merge(fa,fb,on=['longitude','latitude','how='inner')。毫无疑问,这比我在下面的回答中详细阐述的循环快得多。我得到一个错误:只能比较具有相同标签的系列对象
fa[match] = np.where((fa['latitude']==fb['latitude'] and fa['longitude']==fb['longitude']), 'True', 'False')
     time_x  longitude  latitude    time_y
0  14:07:05    106.535     2.524  14:07:05
   index_x    time_x  longitude  latitude  index_y    time_y
0      0.0  14:07:05    106.535     2.524      2.0  14:07:05