加入到大熊猫据帧一列,基于字典的键
问题描述:
我有以下数据框:加入到大熊猫据帧一列,基于字典的键
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'])
抛出一个关键的错误..我是什么失踪?
答
#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: object
也许一个或多个'ip's导致'reader.get'引发异常。什么是错误信息?引发了什么异常? – unutbu
KeyError:'city'。 如果我使用try ... except子句,它仅填充空白的第三列。 – codeless
'KeyError'告诉我它正在返回一个字典,而不是您所期望的键。试试'lambda x:reader.get(x).get('city',dict(names = dict(en ='NA')))['names'] ['en']' – piRSquared