Python 3.x 将函数应用于数据帧

Python 3.x 将函数应用于数据帧,python-3.x,pandas,geocoding,Python 3.x,Pandas,Geocoding,我有一个名为“tourdata”的熊猫数据帧,由676k行数据组成。其中两列是纬度和经度 使用reverse_geocode包,我想将这些坐标转换为国家数据 当我打电话时: import reverse_geocode as rg tourdata['Country'] = rg.search((row[tourdata['latitude']],row[tourdata['longitude']])) 我得到一个错误: ValueErrorTraceback(最近一次呼叫上次) 在() 1

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

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

当我打电话时:

import reverse_geocode as rg

tourdata['Country'] = rg.search((row[tourdata['latitude']],row[tourdata['longitude']]))
我得到一个错误:

ValueErrorTraceback(最近一次呼叫上次) 在() 1坐标=(tourdata['纬度],tourdata['经度]), ---->2 tourdata['Country']=rg.search((第[tourdata['latitude']]行,第[tourdata['latitude']]行)

~/anaconda/envs/py3/lib/python3.6/site packages/reverse\u geocode/init.py 搜索中(坐标) 114 """ 115 gd=地理编码数据() -->116返回gd.query(坐标) 117 118

~/anaconda/envs/py3/lib/python3.6/site packages/reverse\u geocode/init.py 查询中(自身、坐标) 46除e值错误外: 47 logging.info('无法分析坐标:{}'。格式(坐标)) --->48提高e 49.其他: 50结果=[索引中索引的自我位置[索引]

~/anaconda/envs/py3/lib/python3.6/site packages/reverse\u geocode/init.py 查询中(自身、坐标) 43 """ 44尝试: --->45距离,索引=self.tree.query(坐标,k=1) 46除e值错误外: 47 logging.info('无法分析坐标:{}'。格式(坐标))

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

在此方面的任何帮助都将不胜感激。理想情况下,我希望访问生成的字典,并仅将国家代码应用于国家列。

搜索方法需要一个坐标列表。要获取单个数据点,可以使用“get”方法

尝试:

这对我来说很好:

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

通常在python中,您使用map()将函数应用于所有项目,但我对pandas的exp非常少-因此可能不同
tourdata['country']=tourdata.apply(lambda x:rg.search(x['latitude'],x['longitude'],x['longitude'],axis=1)
?谢谢@ScottBoston-当我尝试此操作时,我得到:
TypeError:('search()接受1个位置参数,但2个已给定,“'发生在索引0'”
似乎是您需要的,
tourdata['country']=tourdata.apply(lambda x:rg.search(tuple([x['latitude'],x['latitude']),axis=1)
?谢谢@HarvIpan-这次我得到以下信息:
类型错误:('tuple()最多接受1个参数(给定2个)“,”发生在索引0“
非常感谢!这管用!理想情况下,我只想将国家名称拖到列中,您知道这样做的最佳方法吗?是的,方法的返回是dict,因此您只需传递要提取的元素的名称。试试这个:tourdata['country']=tourdata.apply(lambda x:rg.get((x['latitude'],x['latitude']))['country'],axis=1)。再次感谢您,非常感谢
0    {'country': 'Gabon', 'city': 'Booué', 'country...
1    {'country': 'Sao Tome and Principe', 'city': '...
2    {'country': 'Ghana', 'city': 'Mumford', 'count...
Name: country, dtype: object