【发布时间】:2021-05-03 02:38:59
【问题描述】:
我有两个熊猫数据框, 第一帧 ip2CountryDF 有 2M+ 记录:
startIP, endIP, countryISO
16777216,16777471,US
16777472,16778239,CN
16778240,16779263,AU
出于效率和匹配目的,此数据帧中的 IP 地址表示为整数
第二帧 inputDF 有 60K+ 记录:
sourceIP, eventTime, integerIP
114.119.157.43,01/Mar/2021,1920441643
193.205.128.7,01/Mar/2021,3251470343
193.205.128.7,01/Mar/2021,3251470343
193.205.128.7,01/Mar/2021,3251470343
我拥有的数据全部来自公开的数据集
我要做的是根据 ip2CountryDF 中的值识别 inputDF 中每一行的来源国家/地区。
理想情况下,我将选择 inputDF['integerIP'] 并获取 ip2CountryDF['countryISO'],其中 inputDF 中的 integerIP 在 ip2CountryDF['startIP'] 和 ip2CountryDF['endIP'] 之间的范围内
到目前为止,我使用 for 循环完成了数据,它适用于测试集(在 inputDF 中搜索 5 个条目的数据),但是当我遇到更大的数据集时,我的机器粉丝会拿起,几分钟后我得到了没有结果,我取消了工作(这告诉我我的代码效率有多低),这是我使用的代码(效率低但有效):
countryList = []
for index, row in inputDF.iterrows():
integerIP = row['integerIP']
countryISO = ip2CountryDF.loc[(integerIP >= ip2CountryDF['startIP']) & (integerIP <= ip2CountryDF['endIP']),'countryISO'].iloc[0]
countryList.append(countryISO)
inputDF['countryISO'] = countryList
我需要什么帮助,能否以更有效、更(类似熊猫)的方式更好地处理,我试图使用类似的东西:
inputDF['countryISO'] = ip2CountryDF.loc[(inputDF['integerIP'] >= ip2CountryDF['startIP']) & (inputDF['integerIP'] <= ip2CountryDF['endIP']),'countryISO'].iloc[0]
非常感谢您抽出宝贵时间帮助我解决此问题
【问题讨论】:
-
@a-hadidi,我真的需要知道在哪里可以找到
ip2CountryDF源文件。我很确定我们可以优化以提高搜索速度。 -
@Corralien 我从 ip2location 得到了那个,更具体地说是 ip2location-lite 可免费下载的数据集:lite.ip2location.com/database/ip-country
标签: python python-3.x pandas dataframe