0

我有以下数据框:

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'])

抛出一个关键错误..我错过了什么?

4

1 回答 1

0
#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
于 2017-05-25T23:23:32.150 回答