我有一个如下的数据框架:
id ip
1 219.237.42.155
2 75.74.144.120
3 219.237.42.155通过使用maxmindb geolite2包,我可以找到一个特定的ip分配到哪个城市。以下代码:
from geolite2 import geolite2
reader = geolite2.reader()
reader.get('219.237.42.155')将返回一个字典,通过查找关键字,我实际上可以得到一个城市名称:
reader.get('219.237.42.155')['city']['names']['en']返回:
'Beijing'我遇到的问题是,我不知道如何获取数据帧中每个ip的城市,并将其放入第三列,因此结果将是:
id ip city
1 219.237.42.155 Beijing
2 75.74.144.120 Hollywood
3 219.237.42.155 Beijing我得到的最大收获是使用下面的代码将整个字典映射到一个单独的列:
df['city'] = df['ip'].apply(lambda x: reader.get(x))另一方面:
df['city'] = df['ip'].apply(lambda x: reader.get(x)['city']['names']['en'])抛出键错误..我遗漏了什么?
发布于 2017-05-26 07:23:32
#you can use apply to check if the key exists before trying to access its values.
df.apply(lambda x: reader.get(x.ip,np.nan),axis=1).apply(lambda x: np.nan if pd.isnull(x) else x['city']['names']['en'])
Out[39]:
0 Beijing
1 NaN
2 Beijing
dtype: objecthttps://stackoverflow.com/questions/44188178
复制相似问题