Python Pandas'应用'返回系列;无法转换为dataframe[英] Python Pandas 'apply' returns series; can't convert to dataframe

本文是小编为大家收集整理的关于Python Pandas'应用'返回系列;无法转换为dataframe的处理方法,想解了Python Pandas'应用'返回系列;无法转换为dataframe的问题怎么解决?Python Pandas'应用'返回系列;无法转换为dataframe问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

好的,我在半机智的结束时.我正在使用gaococed teataframe.我已经写了一个简单的功能来拍摄国家名称 - 并返回纬度和经度.我使用应用来运行函数,返回熊猫系列对象.我似乎无法将它转换为dataframe.我相信我错过了一些显而易见的事情,但我是Python的新手,仍然是rtfming. BTW,地理域功能工作很大.

# 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)

我得到一个没有索引的单个dataframe,其中一个菌丝,其中包含该系列.

我已经尝试了许多其他方法,包括'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)方法手动将串行转换为dataframe,而无需成功.

目标是Geocode 166个唯一国家,然后将其加入到DF_Addr中的188K地址.我正在尝试在我的代码中成为Pandas-y,如果可能的话,不是写入循环.但我还没有找到将系列转换成Dataframe的魔力,这是我第一次尝试使用.

提前谢谢 - 古代c程序员

推荐答案

我假设df_geo是一个带单列的df,所以我相信以下应该有效:

更改:

return lat,  lon

return pd.Series([lat,  lon])

然后,您应该可以分配如此:

df_geo_in[['LAT', 'LON']] = df_geo_in.apply(locate)

您尝试的是将applymap到2的结果分配在此处不正确的新列,因为applymap旨在在DF中的每个元素上工作,除非LHS具有相同的预期形状,除非这赢了" t给出了所需的结果.

后一种方法也是不正确的,因为你删除了重复的国家,然后预计这一点来分配每个国家地理位置后面,但形状不同.

大型DF可能更快地创建地理位置非重复的DF,然后将其合并回您的更大的DF,如:

geo_lookup = df_addr.drop_duplicates(['COUNTRY'])
geo_lookup[['LAT','LNG']] = geo_lookup['COUNTRY'].apply(locate)
df_geo_in.merge(geo_lookup, left_on='COUNTRY', right_on='COUNTRY', how='left')

这将创建一个带有geo位置地址的非重复国家的DF,然后我们将左键合并回主DF.

其他推荐答案

始终更容易测试一些样本数据,但请尝试以下zip函数查看它是否有效.

df_geo_in['LAT_LON'] = df_geo_in.applymap(locate) 
df_geo_in['LAT'], df_geo_in['LON'] = zip(*df_geo_in.LAT_LON)

本文地址:https://www.itbaoku.cn/post/1727944.html