pandas csv Data-frame中两点之间的距离

Posted

技术标签:

【中文标题】pandas csv Data-frame中两点之间的距离【英文标题】:Distance between two Points in pandas csv Data-frame 【发布时间】:2018-08-10 20:53:57 【问题描述】:

我想计算以下数据框的两个坐标点(Lat1,long1 和 Lat2,Long2)之间的距离。

`name_x rnc_x   lat1    long1   scrambling_code name_y  rnc_y   lat2    long2
UI11481 MURNC09 72.82584     19.01234   121 UI11481 MURNC09 72.82584     19.01234
UI11481 MURNC09 72.82584     19.01234   121 UI37616 MURNC09 72.8282  19.01753
UI11481 MURNC09 72.82584     19.01234   121 UM13167 MURNC04 72.85002     19.09671
UI11481 MURNC09 72.82584     19.01234   121 UM12606 MURNC12 72.8563  19.18566
UI11481 MURNC09 72.82584     19.01234   121 UI17997 MURNC01 72.82161     18.92689
UI11481 MURNC09 72.82584     19.01234   121 UM36021 MURNC07 72.8816  19.1771
UI11481 MURNC09 72.82584     19.01234   121 UM30099 MURNC12 72.871   19.2173
UI11481 MURNC09 72.82584     19.01234   121 UM2411  MURNC17 72.8599  19.2498
UI11481 MURNC09 72.82584     19.01234   121 UM41377 MURNC22 72.8531  19.0142
UI11481 MURNC09 72.82584     19.01234   121 UM35501 MURNC08 72.8538  19.3042
UI11481 MURNC09 72.82584     19.01234   121 UM6086  MURNC15 72.8046  18.9728
UI11481 MURNC09 72.82584     19.01234   121 UI28816 MURNC14 72.821753    19.060517

`

【问题讨论】:

How to create a Minimal, Complete, and Verifiable example. 欢迎来到 ***。请按照您创建此帐户时的建议阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布 MCVE 代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中并重现您描述的问题。 我已经修改了确切的问题。 【参考方案1】:

如果我理解正确的话,我想出了两种可能的解决方案:

    df['distance'] = np.sqrt((df.lat2 - df.lat1) ** 2 + (df.lon2 - df.lon1) ** 2) df['distance'] = np.linalg.norm(df[["lat1", "lon1"]].values - df[["lat2", "lon2"]].values, axis=1)

编辑: 谢谢你的评论。我误解了你的问题。

所以首先要解决这个问题,我需要一个可以为我重新计算距离的函数。为此,我使用了:

from math import sin, cos, sqrt, atan2, radians
def calculate_distance(lat1, lon1, lat2, lon2):
    R = 6373.0

    lat1 = radians(lat1)
    lon1 = radians(lon1)
    lat2 = radians(lat2)
    lon2 = radians(lon2)

    dlon = lon2 - lon1
    dlat = lat2 - lat1

    a = sin(dlat / 2)**2 + cos(lat1) * cos(lat2) * sin(dlon / 2)**2
    c = 2 * atan2(sqrt(a), sqrt(1 - a))

    return R * c

有关此计算的更多信息,请参阅link

这会给我两点之间的距离。有了这些信息,我将其应用于每一行:

df['distance'] = [calculate_distance(**df[['lat1', 'lon1', 'lat2', 'lon2']].iloc[i].to_dict()) for i in range(df.shape[0])]

这给了我这个结果:

    lat1    lat2    lon1    lon2    distance
1   54  52  54  52  259.614032
2   23  24  56  65  924.586291

请尝试一下:)

【讨论】:

距离值不对,是地球位置无法计算 sqrt(x2-x1,y2-y1),距离为球面距离。 感谢@Dawid_Sielski,解决方案有效,但运行速度很慢,我有500万个这样的条目,任何可以更快解决的解决方案。

以上是关于pandas csv Data-frame中两点之间的距离的主要内容,如果未能解决你的问题,请参考以下文章

进阶学python之 pandas系列之导出为.csv文件

Pandas之csv文件对列行的相关操作

python之pandas库

最牛逼的数据分析之Pandas!亿级数据都能轻松处理!十分钟学会它

python之panda模块2

python读取csv出错怎么解决