我需要在熊猫数据框中将街道名称与gps坐标相匹配。我为此使用OSRM;我可以给OSRM一个GPS坐标列表,它会给我名字,但是我的系列包含NaN,并且OSRM不接受空值或零值,因此我需要过滤掉它们(简单),然后将结果放回相应的位置行;我该怎么做呢?编辑:数据框中还有其他列(我在这里用t
表示,但还有更多列)我不会丢失。
import pandas as pd
import numpy as np
import requests
import json
path = [
51.954974, 5.857131,
51.955014, 5.860725,
np.nan, np.nan,
51.954168, 5.866390,
51.954889, 5.868611,
]
path = [ {'t': t, 'lat': c[0], 'lon': c[1]} for t, c in enumerate(zip(*[path[i::2] for i in range(2)]))]
df = pd.DataFrame(path)
path = ';'.join(list(df[pd.notnull(df.lat)].apply(lambda x: str(x.lon) + ',' + str(x.lat), axis=1)))
osrm = 'http://router.project-osrm.org' # currently down
#osrm = 'http://localhost:5000'
url = osrm + '/match/v1/car/' + path + '?overview=full&annotations=nodes&tidy=true'
# OSRM is down now but this return [ "Metamorfosenallee", "Burgemeester Matsersingel", "Burgemeester Matsersingel", "Batavierenweg" ]
matched = [tp['name'] for tp in requests.post(url).json()['tracepoints']]
# how do I now get
# t lat lon name
# 0 51.954974, 5.857131, Metamorfosenallee
# 1 51.955014, 5.860725, Burgemeester Matsersingel
# 2 np.nan, np.nan, np.nan
# 3 51.954168, 5.866390, Burgemeester Matsersingel
# 4 51.954889, 5.868611, Batavierenweg
(编辑后添加了我不想丢失的额外列)
答案 0 :(得分:0)
应用
df.lat.replace(np.nan, '', inplace=True)
df.lon.replace(np.nan, '', inplace=True)
启用功能
答案 1 :(得分:0)
可能有许多更短的方法可以达到目标。但是您可以尝试以下步骤。
首先,将包含NaN
个值的单独行存储在t
中。我假设NaN
也只能在lat
或lon
中发生。您可以改善它。
t = df.loc[df.lat.isnull() | df.lon.isnull()]
t
lat lon
2 NaN NaN
从NaN
中删除具有df
值的行
df.dropna(inplace=True)
df
lat lon
0 51.954974 5.857131
1 51.955014 5.860725
3 51.954168 5.866390
4 51.954889 5.868611
-
在此处df
做您的工作。
-
然后最终将数据帧t
放回原始数据帧df
。
df = df.append(t).sort_index()
df
lat lon name
0 51.954974 5.857131 Metamorfosenallee
1 51.955014 5.860725 Burgemeester Matsersingel
2 NaN NaN NaN
3 51.954168 5.866390 Burgemeester Matsersingel
4 51.954889 5.868611 Batavierenweg