Применение функции к пандам датафрейм - PullRequest
0 голосов
/ 04 июня 2018

У меня есть фрейм данных pandas под названием 'tourdata', состоящий из 676 тыс. Строк данных.Два столбца - широта и долгота.

С помощью пакета reverse_geocode я хочу преобразовать эти координаты в данные страны.

Когда я звоню:

import reverse_geocode as rg

tourdata['Country'] = rg.search((row[tourdata['latitude']],row[tourdata['longitude']]))

Iполучить ошибку:

ValueErrorTraceback (последний вызов последнего) в () 1 координате = (tourdata ['latitude'], tourdata ['longitude']), ----> 2 tourdata ['Country'] = rg.search ((row [tourdata ['latitude']], row [tourdata ['longitude']]))

~ / anaconda / envs / py3 / lib / python3.6/site-packages/reverse_geocode/init.py в поиске (координаты) 114 "" "115 gd = GeocodeData () -> 116 вернуть gd.query (координаты) 117 118

~ / anaconda / envs / py3 / lib / python3.6 / site-packages / reverse_geocode / init .py в запросе (self, координаты) 46 за исключением ValueError как e: 47 logging.info ('Невозможно дляразбор координат: {} '. формат (координаты)) ---> 48 повысить e 49 еще: 50 результатов = [self.locations [index] для индекса в индексах]

~ / anaconda / envs / py3/lib/python3.6/site-packages/reverse_geocode / init .py в запросе (self, координаты) 43 "" "44 try: ---> 45 расстояний, индексы = self.tree.query (координаты, k = 1) 46 за исключением ValueError ase: 47 logging.info ('Невозможно разобрать координаты: {}'. формат (координаты))

ckdtree.pyx в scipy.spatial.ckdtree.cKDTree.query ()

ValueError: x должен состоять из векторов длины 2, но имеет форму (2, 676701)

Чтобы проверить, что пакет работает:

coordinates = (tourdata['latitude'][0],tourdata['longitude'][0]),
results = (rg.search(coordinates))
print(results)

Выходы:

[{'country_code': 'AT', 'city': 'Wartmannstetten', 'country': 'Austria'}]

Любая помощь с этим приветствуется.В идеале я хотел бы получить доступ к полученному словарю и применить только код страны к столбцу Страна.

1 Ответ

0 голосов
/ 04 июня 2018

Метод поиска ожидает список координат.Чтобы получить одну точку данных, вы можете использовать метод «get».

Попробуйте:

tourdata['country'] = tourdata.apply(lambda x: rg.get((x['latitude'], x['longitude'])), axis=1)

У меня все работает нормально:

import pandas as pd
tourdata = pd.DataFrame({'latitude':[0.3, 2, 0.6], 'longitude':[12, 5, 0.8]})
tourdata['country'] = tourdata.apply(lambda x: rg.get((x['latitude'], x['longitude'])), axis=1)
tourdata['country']

Вывод:

0    {'country': 'Gabon', 'city': 'Booué', 'country...
1    {'country': 'Sao Tome and Principe', 'city': '...
2    {'country': 'Ghana', 'city': 'Mumford', 'count...
Name: country, dtype: object
...