【问题标题】:Applying function to pandas dataframe将函数应用于熊猫数据框
【发布时间】:2018-11-13 22:12:57
【问题描述】:

我有一个名为“tourdata”的 pandas 数据框,由 676k 行数据组成。其中两列是纬度和经度。

使用 reverse_geocode 包我想将这些坐标转换为国家数据。

当我打电话时:

import reverse_geocode as rg

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

我得到了错误:

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 = 地理编码数据() --> 116 返回 gd.query(坐标) 117 118

~/anaconda/envs/py3/lib/python3.6/site-packages/reverse_geocode/init.py 在查询中(自我,坐标) 46 除了 ValueError 作为 e: 47 logging.info('无法解析坐标:{}'.format(coordinates)) ---> 48 加注 其他 49 条: 50 个结果 = [self.locations[index] for index in indices]

~/anaconda/envs/py3/lib/python3.6/site-packages/reverse_geocode/init.py 在查询中(自我,坐标) 43 """ 44 尝试: ---> 45 距离,索引 = self.tree.query(coordinates, k=1) 46 除了 ValueError 作为 e: 47 logging.info('无法解析坐标:{}'.format(coordinates))

scipy.spatial.ckdtree.cKDTree.query() 中的ckdtree.pyx

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'}]

对此的任何帮助表示赞赏。理想情况下,我想访问结果字典并仅将国家代码应用于 Country 列。

【问题讨论】:

  • 通常在 python 中,您使用 map() 将函数应用于所有项目,但我对 pandas 的 exp 很少 - 所以可能会有所不同
  • tourdata['country'] = tourdata.apply(lambda x: rg.search(x['latitude'], x['longitude']), axis=1) ?
  • 感谢@ScottBoston - 当我尝试这个时,我得到:TypeError: ('search() takes 1 positional argument but 2 were given', 'occurred at index 0')
  • 看来你需要tourdata['country'] = tourdata.apply(lambda x: rg.search(tuple([x['latitude'], x['longitude'])]), axis=1) ?
  • 谢谢@HarvIpan - 这次我得到以下信息:TypeError: ('tuple() takes at most 1 argument (2 given)', 'occurred at index 0')

标签: python-3.x pandas geocoding


【解决方案1】:

搜索方法需要一个坐标列表。要获取单个数据点,您可以使用“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

【讨论】:

  • 非常感谢!这行得通!理想情况下,我只想将国家/地区名称拉到列中,您知道最好的方法吗?
  • 是的,方法的返回是一个dict,所以你只需要传递你要提取的元素的名称。试试这个:tourdata['country'] = tourdata.apply(lambda x: rg.get((x['latitude'], x['longitude']))['country'], axis=1)。跨度>
  • 再次感谢,非常感谢
猜你喜欢
  • 1970-01-01
  • 2019-02-07
  • 2013-08-10
  • 2021-02-12
  • 1970-01-01
  • 2020-09-08
  • 2021-08-27
  • 1970-01-01
相关资源
最近更新 更多