如何根据 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 行。
目前我是这样实现的
- 创建了 python 列表来存储每个范围内的所有 ip。例如 ["45.43.144.0", "45.43.144.1", "45.43.144.2", ..., "45.43.161.255"]。所有 ip 范围的类似方式。
- 从此列表中删除了重复元素
- 使用此列表构建数据框
- 在 'ip'
上合并了两个数据帧
此过程适用于 ip_ranges 的小集合。但是对于大量 ip_ranges,该过程需要更长的时间才能完成。
有没有更好的方法可以更有效地执行此操作?
只是一个想法:将范围放入数据框 ip_range
中,其中包含列 From
和 To
。使用提供的快速代码将所有 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
合并。
我有一个包含 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 行。
目前我是这样实现的
- 创建了 python 列表来存储每个范围内的所有 ip。例如 ["45.43.144.0", "45.43.144.1", "45.43.144.2", ..., "45.43.161.255"]。所有 ip 范围的类似方式。
- 从此列表中删除了重复元素
- 使用此列表构建数据框
- 在 'ip' 上合并了两个数据帧
此过程适用于 ip_ranges 的小集合。但是对于大量 ip_ranges,该过程需要更长的时间才能完成。
有没有更好的方法可以更有效地执行此操作?
只是一个想法:将范围放入数据框 ip_range
中,其中包含列 From
和 To
。使用提供的快速代码将所有 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
合并。