【问题标题】:How to filter dataframe based on ip range如何根据 IP 范围过滤数据帧
【发布时间】:2019-02-27 00:05:52
【问题描述】:

我有 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,这个过程需要更长的时间才能完成。

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

【问题讨论】:

  • 我不确定最终所需的输出,但对于初学者,您是否要检查 Dataframe 中 ip 列的每个 ip 是否在 ip_ranges.json 中的任何范围内?跨度>

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


【解决方案1】:

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

现在可以快速生成范围:

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

【讨论】:

    猜你喜欢
    • 2014-07-19
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 2021-01-10
    • 2021-01-07
    • 1970-01-01
    相关资源
    最近更新 更多