Python 在对我的地理位置字段是否有效进行矢量化测试的过程中,我做错了什么?

Python 在对我的地理位置字段是否有效进行矢量化测试的过程中,我做错了什么?,python,pandas,Python,Pandas,我调用了一个地理定位API,并将结果转换为数据帧,如下所示: results = geolocator.lookup(ip_list) 结果: [{ query: "0.0.0.0", coordinates: { lat: "0", lon: "0" } }, ...] 因此,我们查询了0.0.0.0,API返回了lat/long的“0”,这表明IP显然无法地理定位。处理事物的奇怪方式,而不是错误的值或其他东西

我调用了一个地理定位API,并将结果转换为数据帧,如下所示:

results = geolocator.lookup(ip_list)
结果

[{ 
    query: "0.0.0.0", 
    coordinates: { lat: "0", lon: "0" }
}, ...]
因此,我们查询了0.0.0.0,API返回了lat/long的“0”,这表明IP显然无法地理定位。处理事物的奇怪方式,而不是错误的值或其他东西,但我们可以处理它

到数据帧:

df = pd.DataFrame(results)
但是等等,这会导致那些“坐标”字段成为数据帧中的字典,我可能是熊猫初学者,但我知道我可能希望这些字段存储为数据帧,而不是dict,这样我们就可以矢量化了

于是我做了:

for result in results:
    result["coordinates"] = pd.DataFrame(result["coordinates"], index=[0])
df = pd.DataFrame(results)
不确定index=[0]在那里做了什么,但是如果没有它,我会得到一个错误,所以我就这样做了。让我停下来,告诉我为什么我错了,如果到目前为止我做得很糟糕。我不熟悉Python,数据帧比2D更难以可视化

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

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"])
但这会抛出一个关键错误“lon”


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

一般来说,我同意你的观点,字典是存储纬度/经度值的糟糕方法。这是由于pd.DataFrame()的工作方式造成的,因为它将拾取键查询和坐标,其中键坐标的值只是lat/lon值的字典

例如,您可以通过将每一行定义为元组,将整个数据帧定义为这些元组的列表来避免整个问题。然后可以比较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
在这段代码中,我使用列表理解来构建元组列表,并将“Geolocated”列定义为一个系列,它来自行的Lat和Lon值的比较