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

How to filter dataframe based on ip range

我有一个包含 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 包含 100k 个元素,我的数据框有 300k 行。

目前我是这样实现的

此过程适用于 ip_ranges 的小集合。但是对于大量 ip_ranges,该过程需要更长的时间才能完成。

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

只是一个想法:将范围放入数据框 ip_range 中,其中包含列 FromTo。使用提供的快速代码将所有 ip 地址(也包括 df 中的)转换为十进制数字,例如 here

现在可以快速生成范围:

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合并。