首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于字典键向pandas数据框添加列

基于字典键向pandas数据框添加列
EN

Stack Overflow用户
提问于 2017-05-26 03:14:05
回答 1查看 432关注 0票数 0

我有一个如下的数据框架:

代码语言:javascript
复制
id  ip  
1   219.237.42.155
2   75.74.144.120
3   219.237.42.155

通过使用maxmindb geolite2包,我可以找到一个特定的ip分配到哪个城市。以下代码:

代码语言:javascript
复制
from geolite2 import geolite2
reader = geolite2.reader()
reader.get('219.237.42.155')

将返回一个字典,通过查找关键字,我实际上可以得到一个城市名称:

代码语言:javascript
复制
reader.get('219.237.42.155')['city']['names']['en']

返回:

代码语言:javascript
复制
'Beijing'

我遇到的问题是,我不知道如何获取数据帧中每个ip的城市,并将其放入第三列,因此结果将是:

代码语言:javascript
复制
id  ip              city
1   219.237.42.155  Beijing
2   75.74.144.120   Hollywood
3   219.237.42.155  Beijing

我得到的最大收获是使用下面的代码将整个字典映射到一个单独的列:

代码语言:javascript
复制
df['city'] = df['ip'].apply(lambda x: reader.get(x))

另一方面:

代码语言:javascript
复制
df['city'] = df['ip'].apply(lambda x: reader.get(x)['city']['names']['en'])

抛出键错误..我遗漏了什么?

EN

回答 1

Stack Overflow用户

发布于 2017-05-26 07:23:32

代码语言:javascript
复制
#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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44188178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档