Python 3.x 无法从数据帧中的IP地址组中获取国家/地区名称

Python 3.x 无法从数据帧中的IP地址组中获取国家/地区名称,python-3.x,pandas,dataframe,geolocation,Python 3.x,Pandas,Dataframe,Geolocation,我有一个熊猫数据帧df_test,由IP地址组成,如下所示: | cs-username | c-ip | +--------------+-------------+ |- | 70.80.84.76 | |- | 70.80.84.76 | |- | 70.80.84.76 | |- | 70.80.

我有一个熊猫数据帧
df_test
,由IP地址组成,如下所示:

     |  cs-username |   c-ip      |
     +--------------+-------------+
     |-             | 70.80.84.76 |           
     |-             | 70.80.84.76 |
     |-             | 70.80.84.76 |
     |-             | 70.80.84.76 |
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-8-3772268ef132> in <module>()
      2 
      3 #Your code
----> 4 df_test['Country'] = df_test.apply(lambda row: DbIpCity.get(row['c-ip'],api_key='free').country, axis=1)

5 frames
/usr/local/lib/python3.7/dist-packages/ip2geotools/databases/noncommercial.py in get(ip_address, api_key, db_path, username, password)
     65         # format data
     66         ip_location.country = content['countryCode']
---> 67         ip_location.region = content['stateProv']
     68         ip_location.city = content['city']
     69 

KeyError: 'stateProv'
我的目标是从每个IP地址获得国家的名称,我使用了ip2geotools中的DbIpCity

from ip2geotools.databases.noncommercial import DbIpCity

#Your code
df_test['Country'] = df_test.apply(lambda row: DbIpCity.get(row['c-ip'],api_key='free').country, axis=1)

但是,这会导致如下错误:

     |  cs-username |   c-ip      |
     +--------------+-------------+
     |-             | 70.80.84.76 |           
     |-             | 70.80.84.76 |
     |-             | 70.80.84.76 |
     |-             | 70.80.84.76 |
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-8-3772268ef132> in <module>()
      2 
      3 #Your code
----> 4 df_test['Country'] = df_test.apply(lambda row: DbIpCity.get(row['c-ip'],api_key='free').country, axis=1)

5 frames
/usr/local/lib/python3.7/dist-packages/ip2geotools/databases/noncommercial.py in get(ip_address, api_key, db_path, username, password)
     65         # format data
     66         ip_location.country = content['countryCode']
---> 67         ip_location.region = content['stateProv']
     68         ip_location.city = content['city']
     69 

KeyError: 'stateProv'
---------------------------------------------------------------------------
KeyError回溯(最近一次呼叫最后一次)
在()
2.
3#您的代码
---->4 df_测试['Country']=df_测试.apply(lambda行:DbIpCity.get(行['c-ip'],api_key='free')。国家,轴=1)
5帧
/get中的usr/local/lib/python3.7/dist-packages/ip2geotools/databases/noncommercial.py(ip地址、api密钥、db路径、用户名、密码)
65#格式数据
66 ip_location.country=内容['countryCode']
--->67 ip_location.region=内容['stateProv']
68 ip_location.city=内容['city']
69
KeyError:'stateProv'
参考时,代码位于下面的colab链接(最后一个单元格)中:

那么我如何解决这个错误呢


谢谢

当程序无法获取有关IP地址的任何数据时,会抛出一个
键错误
。为了避免脚本停止,可以使用
异常
。但是由于
ip2geotools
库有一个请求限制,我决定改为: (我对循环使用了
而不是
lambda

而且,由于您的CSV文件太大,请使用过滤器避免处理重复的IP

我在您的日志中发现了以下错误:

ERROR: geoip2 4.1.0 has requirement requests<3.0.0,>=2.24.0, but you'll have requests 2.23.0 which is incompatible.
ERROR: geoip2 4.1.0 has requirement urllib3<2.0.0,>=1.25.2, but you'll have urllib3 1.24.3 which is incompatible.
错误:geoip2 4.1.0的需求请求=2.24.0,但您将有不兼容的请求2.23.0。
错误:geoip2 4.1.0要求urllib3=1.25.2,但urllib3 1.24.3不兼容。

尝试执行
pip安装--升级请求urllib3
。您可能必须升级它们。

为了避免
键错误:'stateProv'
,在noncommercial.py中:

…/ip2geotools/databases/noncommercial.py

应注释第67行,并插入一行:
ip_location.region=''

为ip_location.region生成空字符串

67      #ip_location.region = content['stateProv']

        ip_location.region = ''

我在课堂上做了一个bash shell实践的例子:


$whois 70.80.84.76 | grep Country:| uniq | cut-d':'-f2

我们可以从数据帧(即“c-IP”)传递整个IP地址列吗?我有很多IP地址存储在一列中。当然,你可以添加你自己的数据帧,它应该可以工作。我尝试运行一列IP地址(大约200k)的解决方案,但我仍然遇到我在帖子中提到的关键错误。你知道为什么在你的上述解决方案中没有发生错误吗?此外,我尝试更新您建议的urllib3,但仍然会弹出错误。您在哪里运行代码?Linux、windows…当然,如果您找到替代的IP库,请更新您的答案(以及现有答案)。我非常希望看到替代的(解决方案),它可能对将来需要帮助的其他人有所帮助。但这个问题是关于Python的,不是bash shell教授。这个ip2geotools对于非商业库一天的IP数量是有限的,而这个bash没有限制。正确目标的正确脚本。同意,这是ip2geotools的主要限制。这就是为什么其中一个答案建议使用地理定位数据库。