Как отфильтровать фрейм данных на основе диапазона IP-адресов - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть датафрейм, который имеет 2 столбца.Я хочу отфильтровать этот фрейм данных на основе диапазонов ip, присутствующих в файле json.

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 содержит 100 тыс. Элементов, а мой информационный фрейм содержит 300 тыс. Строк.

В настоящее время я реализовал так:

  • Создан список Python для хранения всех ips вкаждый диапазон.Например, ["45.43.144.0", "45.43.144.1", "45.43.144.2", ..., "45.43.161.255"].Аналогичный способ для всех диапазонов IP.
  • Удалены повторяющиеся элементы из этого списка.
  • Построенный фрейм данных с использованием этого списка
  • Объединение двух фреймов данных в 'ip'

Этот процесс отлично работает длянебольшой набор ip_ranges.Но для большого набора ip_ranges процесс занимает больше времени.

Есть ли лучший подход для более эффективного выполнения этого?

1 Ответ

0 голосов
/ 26 февраля 2019

Просто идея: поместите диапазоны в фрейм данных ip_range со столбцами From и To.Преобразуйте все ip-адреса (тоже в df) в десятичные числа с быстрым кодом, указанным, например, здесь .

Теперь генерацию диапазонов можно выполнить быстро:

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

Эти диапазоны можно преобразовать в фрейм данных:

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

Этот DataFrame может быть легко объединен с df.

...