Примените функцию к столбцу панд, где эта функция не принимает NaN - PullRequest
0 голосов
/ 03 октября 2018

Мне нужно сопоставить названия улиц с координатами GPS в кадре данных pandas.Я использую 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

(отредактирован для добавления дополнительного столбца, который я не хочу терять)

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Там может быть много более коротких способов достичь цели.Но вы можете попробовать выполнить следующие шаги:

Сначала разделите строки, содержащие значения 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
0 голосов
/ 03 октября 2018

Применить

df.lat.replace(np.nan, '', inplace=True)
df.lon.replace(np.nan, '', inplace=True)

к функции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...