【问题标题】:pass over errors with for loops and fill in row with None用 for 循环传递错误并用 None 填充行
【发布时间】:2021-03-31 04:27:40
【问题描述】:

我正在使用 for 循环遍历数据框中的行并将函数应用于其中两列中的值,以使用 geopy 从城市名称获取坐标。一些值会引发错误,我想在 for 循环内使用 try / except(或 catch?),以便在将 geopy 应用于其中一个值引发错误的情况下,python 只会用“无”填充该行' 然后我可以返回并删除那些带有 'None' 的行。有没有办法做到这一点?这是我正在使用的代码:

list_lat = []   # create empty list for lat
list_long = [] # create empty list for long

for index, row in df.iterrows(): # iterate over rows in dataframe
    try:
        City = row['City Name']
        State = row['State Name']       
        query = str(City)+','+str(State)

        location = geolocator.geocode(query)
        lat = location.latitude
        long = location.longitude
        #print(lat, long) #testing purposes

        list_lat.append(lat)
        list_long.append(long)
    
    
    except Exception as e:
        
#         lat = 'None'
#         long = 'None'

【问题讨论】:

    标签: pandas dataframe try-catch geopy nominatim


    【解决方案1】:

    如果您希望将 lat 和 long 添加为列,可以尝试这样的操作。

    def fn(row):
        city = row['City Name']
        State = row['State Name']       
        query = str(City)+','+str(State)
        try:
            location = geolocator.geocode(query)
            lat = location.latitude
            long = location.longitude
            return lat,long
        except:
            return np.NaN,np.NaN
    
    df[['lat','long']] = df.apply(lambda x: fn(x),axis=1,result_type='expand')
    

    这将产生 2 个额外的列,其中包含函数的相应 lat 和 long 结果。

    你可以使用删除 NaN 值

    df.dropna()
    

    但请记住,对于庞大的数据集,单独迭代每一行可能会很慢

    【讨论】:

    • 谢谢!我注意到它非常慢——我不得不将它从 31000 行减少到 4000 行的样本。有更快的方法吗?
    • 抱歉,由于您需要使用 try/except 并遍历每一行,因此我不熟悉无需使用自定义函数即可实现此目的的其他方法。我会对此进行研究并尝试回复您,以防我偶然发现任何事情。同时,我们可以等待其他答案。
    猜你喜欢
    • 1970-01-01
    • 2011-09-29
    • 2020-07-18
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多