获取数据帧的一行和数据列之间的最小值



我有两个数据帧,其中一个有关于铁路和坐标的数据,另一个有城市代码和坐标,但这些坐标并不完全匹配,所以我需要计算数据帧b的所有坐标与数据帧a中的行之间的差,以选择差最小的城市代码。

数据帧a:

| FROMNODENO | TONODENO |     LON    |     LAT    |
|     3      |    4     | -46.720863 | -23.653625 |
|     3      |    5     | -46.868323 | -23.270917 |
|     4      |    6     | -46.869839 | -23.274121 |  

数据帧b:

|   COD   |    LON    |    LAT   |
| 5200050 | -16.75730 | -49.4412 |
| 3100104 | -18.48310 | -47.3916 |
| 5200100 | -16.19700 | -48.7057 |

我需要最终的数据帧是这样的:

| FROMNODENO | TONODENO |     LON    |     LAT    |   COD   |
|     3      |    4     | -46.720863 | -23.653625 | 5200050 |

我想我需要做一个for循环,但我不知道如何才能做

您可以使用类似geo_pandas的包来有效地解决此问题。但是,如果你不能/不想安装另一个第三方依赖程序,那么你可以:

  1. 交叉连接这些数据帧
  2. 计算每个的abs LAT/LON距离
  3. 然后针对每个节点将该数据向下过滤到最小值
print(cities)
COD      LON      LAT
0  5200050 -16.7573 -49.4412
1  3100104 -18.4831 -47.3916
2  5200100 -16.1970 -48.7057
print(nodes)
FROMNODENO  TONODENO        LON        LAT
0           3         4 -46.720863 -23.653625
1           3         5 -46.868323 -23.270917
2           4         6 -46.869839 -23.274121
out = (
pd.merge(cities, nodes, how="cross", suffixes=("_city", "_node"))
.eval("combined_abs_dist = abs(LON_city - LON_node) + abs(LAT_city - LAT_node)")
.loc[lambda df: 
df.groupby(["FROMNODENO", "TONODENO"])["combined_abs_dist"].idxmin()
]
)
print(out)
COD  LON_city  LAT_city  FROMNODENO  TONODENO   LON_node   LAT_node  combined_abs_dist
3  3100104  -18.4831  -47.3916           3         4 -46.720863 -23.653625          51.975738
4  3100104  -18.4831  -47.3916           3         5 -46.868323 -23.270917          52.505906
5  3100104  -18.4831  -47.3916           4         6 -46.869839 -23.274121          52.504218

相关内容

  • 没有找到相关文章

最新更新