Python 3.x 将函数应用于数据帧
我有一个名为“tourdata”的熊猫数据帧,由676k行数据组成。其中两列是纬度和经度 使用reverse_geocode包,我想将这些坐标转换为国家数据 当我打电话时: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
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