如何从map映射结果提取单独返回值以拆分经纬度列?
拆分经纬度元组为单独列的解决方案
没问题,这事儿其实有好几条路子能走,我给你拆解清楚:
方法1:从已有的geolocation列拆分(最直接)
如果你已经生成了geolocation列,只需要把元组里的两个元素分别提取到新列就行。这里有两种高效的方式:
方式A:用apply提取索引
# 提取纬度(元组第一个元素) df['latitude'] = df['geolocation'].apply(lambda x: x[0]) # 提取经度(元组第二个元素) df['longitude'] = df['geolocation'].apply(lambda x: x[1])
方式B:用pd.DataFrame批量拆分(更高效)
当数据量比较大的时候,这种方法速度更快:
# 把元组列表转换成DataFrame,直接赋值给新列 df[['latitude', 'longitude']] = pd.DataFrame(df['geolocation'].tolist(), index=df.index)
方法2:直接生成经纬度列,跳过中间元组列
如果你不需要保留geolocation这个中间列,或者想一步到位,可以修改你的add_geolocation函数,直接生成latitude和longitude:
def add_geolocation(df, country_column): # 调用geolocate后直接拆分成两列 df[['latitude', 'longitude']] = country_column.apply( lambda x: pd.Series(geolocate(x)) # 把元组转成Series,自动对应列 ) # 如果还是需要保留geolocation列,加上这行 df['geolocation'] = list(zip(df['latitude'], df['longitude'])) return df
关于你问的「在lambda里拆分元组」
你提到的先拆分latitude, longitude = geolocate(country)再单独取用的思路是可行的,但直接这么写在lambda里不太方便,不过可以换个方式实现:
# 但注意:这种方式会调用geolocate两次,效率偏低,不推荐大数据集用 df['latitude'] = country_column.apply(lambda x: geolocate(x)[0]) df['longitude'] = country_column.apply(lambda x: geolocate(x)[1])
因为每提取一次纬度或经度都要调用一次geolocate,相当于重复请求地理编码,既慢又可能浪费API配额(如果用的是第三方地理服务),所以更推荐前面两种只调用一次的方法。
内容的提问来源于stack exchange,提问作者yudhiesh
相关产品推荐
相关产品推荐

