首页 > 解决方案 > 在对我的地理位置字段是否有效的测试进行矢量化测试的过程中,我做错了什么?

问题描述

我正在调用地理定位 API,并将结果转换为 DataFrame,如下所示:

results = geolocator.lookup(ip_list)

results

[{ 
    query: "0.0.0.0", 
    coordinates: { lat: "0", lon: "0" }
}, ...]

因此,我们查询了 0.0.0.0,API 为 lat/long 返回了“0”,表示显然无法进行地理定位的 IP。与 False 值或其他东西相反的奇怪处理方式,但我们可以使用它。

到数据框:

df = pd.DataFrame(results)

但是等等,这导致那些“坐标”字段成为 DataFrame 中的字典,我可能是 Panda 初学者,但我知道我可能希望将这些字段存储为 DataFrames,而不是 dicts,所以我们可以矢量化。

所以我做了:

for result in results:
    result["coordinates"] = pd.DataFrame(result["coordinates"], index=[0])
df = pd.DataFrame(results)

不知道index=[0]那里有什么,但没有它我会得到一个错误,所以我就这样做了。在这里停下来,告诉我如果我到目前为止做得不好,为什么我错了。我是 Python 的新手,超过 2D 的 DataFrame 难以可视化。

然后我想处理并添加一个带有或基于矢量化测试df的“地理定位”列,并尝试这样做:TrueFalse

def is_geolocated(coordinate_df):
    # yes the API returned string coords
    lon_zero = np.equal(coordinate_df["lon"], "0") # error here
    lat_zero = np.equal(coordinate_df["lat"], "0")
    return lon_zero & lat_zero

df["geolocated"] = is_mappable(df["coordinates"])

但这会引发 KeyError “lon”。

我是否走在正确的轨道上,如果没有,我应该如何设置?

标签: pythonpandas

解决方案


一般来说,我同意你的观点,字典是存储纬度/经度值的不好方法。发生这种情况是由于 pd.DataFrame() 的工作方式,因为它将获取键查询和坐标,其中键坐标的值只是一个纬度/经度值的字典。

您可以通过例如将每一行定义为一个元组,将整个数据框定义为这些元组的列表来规避整个问题。然后,您可以比较 lat 和 lon 值是否都为零,并将其作为新列返回。

import pandas as pd

# Test dataset
results = [{ 
    'query': "0.0.0.0", 
    'coordinates': { 'lat': "0", 'lon': "0" }
},
{ 
    'query': "0.0.0.0", 
    'coordinates': { 'lat': "1", 'lon': "1" }
}]

df = pd.DataFrame([(result['query'], result['coordinates']['lat'], result['coordinates']['lon']) for result in results])
df.columns = ['Query', 'Lat', 'Lon']
df['Geolocated'] = ((df['Lat'] == '0') & (df['Lon'] == '0'))
df.head()

    Query   Lat Lon Geolocated
0   0.0.0.0 0   0   True
1   0.0.0.0 1   1   False

在这段代码中,我使用列表推导来构建元组列表,并将“地理定位”列定义为一个序列,该序列来自行的纬度和经度值的比较。


推荐阅读