Python 我应该如何定位1100000行坐标信息?
好的,所以我正试图设想一个解决方案。我有一个超过一百万行的数据库,其中包括美国的一个城市名称和该城市的一组坐标。问题是有多个城市同名:例如,新泽西州斯普林菲尔德和马萨诸塞州斯普林菲尔德。所以我需要得到州政府的信息 数据中也存在重复项。只有大约6500组唯一坐标,因此可以想象,我可以找到这些坐标,然后将它们分配给数据库中的其他条目。这是一个可行的计划吗?我该怎么办 以下是此数据库中条目的一些示例:Python 我应该如何定位1100000行坐标信息?,python,pandas,geolocation,google-geocoder,Python,Pandas,Geolocation,Google Geocoder,好的,所以我正试图设想一个解决方案。我有一个超过一百万行的数据库,其中包括美国的一个城市名称和该城市的一组坐标。问题是有多个城市同名:例如,新泽西州斯普林菲尔德和马萨诸塞州斯普林菲尔德。所以我需要得到州政府的信息 数据中也存在重复项。只有大约6500组唯一坐标,因此可以想象,我可以找到这些坐标,然后将它们分配给数据库中的其他条目。这是一个可行的计划吗?我该怎么办 以下是此数据库中条目的一些示例: 2015-09-01 00:00:00,Buffalo,"42.9405299,-78.869790
2015-09-01 00:00:00,Buffalo,"42.9405299,-78.8697906",10.1016/s0894-7317(12)00840-1,42.9405299,-78.8697906,43.0,-79.0
2015-09-01 00:00:00,New York,"40.7830603,-73.9712488",10.1016/j.jmv.2014.04.008,40.783060299999995,-73.9712488,41.0,-74.0
2015-09-01 00:00:04,Scottsdale,"33.4941704,-111.9260519",10.1016/j.euroneuro.2014.05.008,33.494170399999994,-111.9260519,33.0,-112.0
2015-09-01 00:00:09,Provo,"40.2338438,-111.6585337",10.1016/j.toxac.2014.07.002,40.233843799999995,-111.6585337,40.0,-112.0
2015-09-01 00:00:13,New York,"40.7830603,-73.9712488",10.1016/j.drugalcdep.2014.09.015,40.783060299999995,-73.9712488,41.0,-74.0
2015-09-01 00:00:16,Fremont,"37.5482697,-121.9885719",10.1016/j.ajic.2012.04.160,37.548269700000006,-121.98857190000001,38.0,-122.0
2015-09-01 00:00:24,Provo,"40.2338438,-111.6585337",10.1016/j.chroma.2015.01.036,40.233843799999995,-111.6585337,40.0,-112.0
我正在使用该软件包进行地理定位。下面是我编写的一些代码,可以处理这个问题:
def convert_to_state(lati, long):
lat, lon = float(lati), float(long)
g = geocoder.google([lat, lon], method='reverse')
state_long, state_short = g.state_long, g.state
return state_long, state_short
我只是不知道该怎么做。事实证明,地理编码是相当昂贵的,所以使用副本可能是最好的前进方式。关于如何实现这一点,有什么建议吗?几乎可以肯定,避免做额外工作的最佳方法是使用哈希表检查某个对象是否已经有映射:
processed_coords = {}
def convert_to_state(lati, long):
lat, lon = float(lati), float(long)
if (lat, lon) not in processed_coords:
g = geocoder.google([lat, lon], method='reverse')
state_long, state_short = g.state_long, g.state
processed_coords[(lat,lon)] = (state_long, state_short)
return state_long, state_short
else:
return processed_coords[(lat,lon)]
通过这种方式,你可以做一个简单的O1检查,看看你是否已经有了数据,这根本不是额外的计算,如果你确实已经做了,你就不需要重做
如果你是对的,并且只有6500组唯一坐标,那么这项技术的内存使用情况应该可以,但是如果你错了,并且有更多的唯一坐标,如果这一百万个东西中有更多是唯一的,您可能会遇到一些内存问题。几乎可以肯定,避免做额外工作的最佳方法是使用哈希表检查某个东西是否已经有映射:
processed_coords = {}
def convert_to_state(lati, long):
lat, lon = float(lati), float(long)
if (lat, lon) not in processed_coords:
g = geocoder.google([lat, lon], method='reverse')
state_long, state_short = g.state_long, g.state
processed_coords[(lat,lon)] = (state_long, state_short)
return state_long, state_short
else:
return processed_coords[(lat,lon)]
通过这种方式,你可以做一个简单的O1检查,看看你是否已经有了数据,这根本不是额外的计算,如果你确实已经做了,你就不需要重做
如果你是对的,并且只有6500组唯一坐标,那么这项技术的内存使用情况应该是不错的,但是如果你错了,并且有更多的唯一坐标,那么如果这些百万个坐标中有更多的是唯一的,那么你可能会遇到一些内存问题。我喜欢哈希表的想法,但这里有一个替代方法,使用一些熊猫的东西: 1获取一个唯一的lat、lon坐标列表
df['latlon'] = [(x,y) for x,y in zip(df['lati'].tolist(),df['long'].tolist())]
unique_ll = df['latlon'].unique()
2通过唯一坐标循环,并设置所有等效线的状态
for l in unique_ll:
df.loc[df['latlon'] == l, 'state'] = convert_to_state(l[0],l[1])
我喜欢哈希表的想法,但这里有一个替代方法,使用一些熊猫的东西: 1获取一个唯一的lat、lon坐标列表
df['latlon'] = [(x,y) for x,y in zip(df['lati'].tolist(),df['long'].tolist())]
unique_ll = df['latlon'].unique()
2通过唯一坐标循环,并设置所有等效线的状态
for l in unique_ll:
df.loc[df['latlon'] == l, 'state'] = convert_to_state(l[0],l[1])
有一个地理信息服务SmartyStreets,它有一个列表工具,可以处理搜索列表并返回一组信息,可以上传电子表格或复制粘贴。他们专注于地址验证,所以他们希望搜索词是地址,然而,它可以只匹配城市和州的邮政编码。你有权访问该信息吗
这里有一个。有一个地理信息服务SmartyStreets,它有一个列表工具,可以处理搜索列表并返回一组信息,可以上传电子表格或复制粘贴。他们专注于地址验证,所以他们希望搜索词是地址,然而,它可以只匹配城市和州的邮政编码。你有权访问该信息吗
下面是一个。您可以使用SQL查询来获取唯一的数据,例如坐标。尝试类似于从表中选择不同的城市和坐标。不过,您必须替换正确的列名和表名。我从未使用过SQL,也没有足够的时间学习。有什么方法可以在python和pandas中实现这一点吗?您可以在获取数据后使用for循环创建一个嵌套列表,只需检查新数据是否为duplicate@Merlin我的错误是,我忘了包括列名。最后两列是在groupby中使用的四舍五入坐标。运行此命令可查看uniques df的数量。groupby['City','lat',long].count您可以使用SQL查询来获取唯一的数据,例如坐标。尝试类似于从表中选择不同的城市和坐标。不过,您必须替换正确的列名和表名。我从未使用过SQL,也没有足够的时间学习。有什么方法可以在python和pandas中实现这一点吗?您可以在获取数据后使用for循环创建一个嵌套列表,只需检查新数据是否为duplicate@Merlin我的错误是,我忘了包括列名。最后两列是在groupby中使用的四舍五入坐标。运行此命令可查看uniques df的数量。groupby['City','lat',long].count您应该提到的是:将熊猫作为pd导入;df=pd.read\u csvfilename;您应该提到:作为pd导入熊猫;df=pd.read\u csvfilename;