我正在对具有将近7万个条目的数据帧执行三重循环。如何优化它?
我的最终目标是创建一个包含地震事件所在国家/地区的新列。我有一个纬度,经度和“位置”(例如:“阿拉斯加北尼纳纳以北17公里”)。我尝试反转地址解析,但是有68,488个条目,没有免费的服务可以使我做到这一点。作为学生,我负担不起。
因此,我正在使用带有国家/地区列表的数据框和带有国家/地区列表的数据框来与USGS ['place']的值进行比较。为此,我最终决定使用3 for循环。
您可以假设,这需要很长时间。我希望有一种方法可以加快速度。我正在使用python,但同时也使用r。 for循环在python上运行得更好。
我会采取任何更好的选择。
USGS = pd.DataFrame(data = {'latitide':[64.7385, 61.116], 'longitude':[-149.136, -138.655], 'place':['17km N of North Nenana, Alaska', '74km WNW of Haines Junction, Canada'], 'country':[NA, NA]})
states = pd.DataFrame(data = {'state':['AK', 'AL'], 'name':['Alaska', 'Alabama']})
countries = pd.DataFrame(data = {'country':['Afghanistan', 'Canada']})
for head in states:
for state in states[head]:
for p in USGS['place']:
if state in p:
USGS['country'] = USGS['country'].map({p : 'United 'States'})
# I have not finished the code for the countries dataframe
答案 0 :(得分:1)
您确实有进行地理编码的选项。 Mapquest每月免费提供15,000个电话。您也可以查看使用的geopy。
import pandas as pd
import geopy
from geopy.geocoders import Nominatim
USGS_df = pd.DataFrame(data = {'latitude':[64.7385, 61.116], 'longitude':[-149.136, -138.655], 'place':['17km N of North Nenana, Alaska', '74km WNW of Haines Junction, Canada'], 'country':[None, None]})
geopy.geocoders.options.default_user_agent = "locations-application"
geolocator=Nominatim(timeout=10)
for i, row in USGS_df.iterrows():
try:
lat = row['latitude']
lon = row['longitude']
location = geolocator.reverse('%s, %s' %(lat, lon))
country = location.raw['address']['country']
print ('Found: ' + location.address)
USGS_df.loc[i, 'country'] = country
except:
print ('Location not identified: %s, %s' %(lat, lon))
输入:
print (USGS_df)
latitude longitude place country
0 64.7385 -149.136 17km N of North Nenana, Alaska None
1 61.1160 -138.655 74km WNW of Haines Junction, Canada None
输出:
print (USGS_df)
latitude longitude place country
0 64.7385 -149.136 17km N of North Nenana, Alaska USA
1 61.1160 -138.655 74km WNW of Haines Junction, Canada Canada