如何根据IP范围过滤数据帧

时间:2019-02-26 13:52:06

标签: pandas dataframe filter python-3.6 ip-address

我有2列的数据框。我想根据json文件中存在的ip范围过滤此数据帧。

ip_ranges.json

[
    {"start": "45.43.144.0", "end": "45.43.161.255"}
    {"start": "104.222.130.0", "end": "104.222.191.255"}
    ...
]

数据框:

ip,p_value
97.98.173.96,3.7
73.83.192.21,6.9
...

注意:ip_range.json包含10万个元素,我的数据框有30万行。

目前,我是这样实现的

  • 创建了python列表以存储每个范围内的所有ip。例如[“ 45.43.144.0”,“ 45.43.144.1”,“ 45.43.144.2”,...,“ 45.43.161.255”]。对于所有ip范围都采用类似的方式。
  • 从此列表中删除了重复的元素
  • 使用此列表构造的数据框
  • 在“ ip”上合并了两个数据框

此过程对于少量的ip_ranges正常工作。但是,对于大量ip_ranges而言,该过程需要更长的时间才能完成。

有没有更好的方法可以更有效地执行此操作?

1 个答案:

答案 0 :(得分:1)

一个主意:将您放入具有ip_rangeFrom列的数据框To中。使用提供的快速代码,例如here,将所有ip地址(df中的IP地址也转换为十进制数字)。

现在可以快速生成范围:

ip_range['Rng'] = ip_range.apply(lambda x: np.arange(x.From, x.To+1), axis=1)

这些范围可以转换为DataFrame:

ips = pd.DataFrame(itertools.chain(*ip_range['Rng']))

此DataFrame可以轻松与df合并。