【发布时间】:2015-06-04 06:13:24
【问题描述】:
好吧,我半途而废了。我正在使用 geopy 对数据框进行地理编码。我编写了一个简单的函数来接受输入 - 国家名称 - 并返回纬度和经度。我使用 apply 来运行该函数,它返回一个 Pandas 系列对象。我似乎无法将其转换为数据框。我确定我遗漏了一些明显的东西,但我是 python 新手,仍然是 RTFMing。顺便说一句,地理编码器功能很好用。
# Import libraries
import os
import pandas as pd
import numpy as np
from geopy.geocoders import Nominatim
def locate(x):
geolocator = Nominatim()
# print(x) # debug
try:
#Get geocode
location = geolocator.geocode(x, timeout=8, exactly_one=True)
lat = location.latitude
lon = location.longitude
except:
#didn't work for some reason that I really don't care about
lat = np.nan
lon = np.nan
# print(lat,lon) #debug
return lat, lon # Note: also tried return { 'LAT': lat, 'LON': lon }
df_geo_in = df_addr.drop_duplicates(['COUNTRY']).reset_index() #works perfectly
df_geo_in['LAT'], df_geo_in['LON'] = df_geo_in.applymap(locate)
# error: returns more than 2 values - default index + column with results
我也试过
df_geo_in['LAT','LON'] = df_geo_in.applymap(locate)
我得到一个没有索引的数据框和一个包含系列的列。
我尝试了许多其他方法,包括“applymap”:
source_cols = ['LAT','LON']
new_cols = [str(x) for x in source_cols]
df_geo_in = df_addr.drop_duplicates(['COUNTRY']).set_index(['COUNTRY'])
df_geo_in[new_cols] = df_geo_in.applymap(locate)
长时间返回错误:
ValueError:列必须与键长度相同
我还尝试使用 df.from_dict(df_geo_in) 方法手动将系列转换为数据框,但没有成功。
目标是对 166 个独特的国家/地区进行地理编码,然后将其连接回 df_addr 中的 188K 地址。我试图在我的代码中成为 pandas-y 并且尽可能不编写循环。但是我还没有找到将系列转换为数据帧的魔力,这是我第一次尝试使用 apply。
提前致谢 - 古代 C 程序员
【问题讨论】:
-
type(df_geo_in) 在不同的点上说什么?它是一个数据框吗?还是一个系列?无论如何,您可能想要 df_geo_in.fromdict() ? df 没有任何意义,除非你定义它。你可能需要 pd.DataFrame(df_geo_in)
标签: python pandas apply geocode geopy