使用 Python Pandas 合并距离矩阵结果和原始索引

Posted

技术标签:

【中文标题】使用 Python Pandas 合并距离矩阵结果和原始索引【英文标题】:Merge distance matrix results and original indices with Python Pandas 【发布时间】:2019-05-23 14:05:20 【问题描述】:

我有一个带有巴士站列表及其地理位置的熊猫 df:

    stop_id   stop_lat   stop_lon  
0   1         32.183939  34.917812  
1   2         31.870034  34.819541  
2   3         31.984553  34.782828  
3   4         31.888550  34.790904  
4   6         31.956576  34.898125  

stop_id 不一定是增量的。

使用sklearn.metrics.pairwise.manhattan_distances我计算距离并得到一个对称距离矩阵:

array([[0.      , 1.412176, 2.33437 , 3.422297, 5.24705 ],
       [1.412176, 0.      , 1.151232, 2.047153, 4.165126],
       [2.33437 , 1.151232, 0.      , 1.104079, 3.143274],
       [3.422297, 2.047153, 1.104079, 0.      , 2.175247],
       [5.24705 , 4.165126, 3.143274, 2.175247, 0.      ]])

但我现在无法轻松地将两者联系起来。我想要一个 df,其中包含每对停靠点及其距离的元组,例如:

stop_id_1 stop_id_2 distance
1         2         3.33

我尝试使用下三角形,转换为矢量和各种方法,但我觉得我只是让事情过于复杂而没有成功。

【问题讨论】:

【参考方案1】:

希望这会有所帮助!

d= '''    stop_id   stop_lat   stop_lon  
0   1         32.183939  34.917812  
1   2         31.870034  34.819541  
2   3         31.984553  34.782828  
3   4         31.888550  34.790904  
4   6         31.956576  34.898125 '''

df = pd.read_csv(pd.compat.StringIO(d), sep='\s+') 

from sklearn.metrics.pairwise import manhattan_distances
distance_df = pd.DataFrame(manhattan_distances(df))

distance_df.index = df.stop_id.values
distance_df.columns = df.stop_id.values
print(distance_df)

输出:

          1         2         3         4         6
1  0.000000  1.412176  2.334370  3.422297  5.247050
2  1.412176  0.000000  1.151232  2.047153  4.165126
3  2.334370  1.151232  0.000000  1.104079  3.143274
4  3.422297  2.047153  1.104079  0.000000  2.175247
6  5.247050  4.165126  3.143274  2.175247  0.000000

现在,要创建相同 df 的长格式,请使用以下命令。

long_frmt_dist=distance_df.unstack().reset_index()
long_frmt_dist.columns = ['stop_id_1', 'stop_id_2', 'distance']
print(long_frmt_dist.head())

输出:

   stop_id_1  stop_id_2  distance
0          1          1  0.000000
1          1          2  1.412176
2          1          3  2.334370
3          1          4  3.422297
4          1          6  5.247050

【讨论】:

【参考方案2】:
df_dist = pd.DataFrame.from_dict(dist_matrix)
pd.merge(df, df_dist, how='left', left_index=True, right_index=True)

example

【讨论】:

以上是关于使用 Python Pandas 合并距离矩阵结果和原始索引的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas 数据框中计算动态时间扭曲距离

如何使用 PANDAS / Python 将矩阵转换为列数组

在 Pandas 中将字典转换为对称/距离矩阵的最有效方法

在python pandas中合并两个数据框[重复]

Python Pandas Dataframe 合并并只选择几列

如何在 Pandas Python 中合并时避免笛卡尔坐标