Как перебрать и сопоставить IP с диапазонами IP (cidr) в python? - PullRequest
0 голосов
/ 31 января 2020

У меня есть таблица с 'State' и соответствующий диапазон CIDR IP, связанный с этим состоянием.

ТАБЛИЦА A

--------------------------------------------------
| ID         | State       | IP_subnet           |
--------------------------------------------------
| 1          |      CA     |    192.168.1.0/24   |
--------------------------------------------------
| 2          |      TX     |    172.68.7.0/24    |
--------------------------------------------------
| 3          |      NY     |    61.141.47.0/24   |
--------------------------------------------------

Я хотел бы повторить через таблицу ниже и сопоставьте поле IP с полем IP_subnet.

ТАБЛИЦА B

| ID         |          IP           | 
--------------------------------------
| 1          |      61.141.47.1      |
--------------------------------------
| 2          |      192.168.1.48     | 
--------------------------------------
| 3          |      172.68.7.124     |
--------------------------------------
| 4          |      40.32.123.212    |
--------------------------------------

Ниже приведены результаты, к которым я стремлюсь: (сопоставление связанного State с IP)

| ID         |          IP           |      State  |
--------------------------------------------------
| 1          |      61.141.47.1      |      null   |
--------------------------------------------------
| 2          |      192.168.1.48     |      CA     |
--------------------------------------------------
| 3          |      172.68.7.124     |      TX     |
--------------------------------------------------
| 4          |      40.32.123.212    |      NY     |
--------------------------------------------------

Я знаю, что приведенный ниже код будет работать для 1 значения. Как перебрать столбец IPs против другого?

from ipaddress import IPv4Address, IPv4Network

IPv4Address('172.68.7.124') in IPv4Network('172.68.7.0/24')

FYi

  • 192.168.1.0 / 24 == диапазон [192.168.1.0 - 192.168.1.255 ]
  • 172.68.7.0 / 24 == range [172.68.7.0 TO 172.68.7.255]

инициализировать список списков

data = [[1, ' CA ',' 192.168.1.0/24 '], [2,' TX ',' 172.68.7.0/24 '], [' juli ', 14], [3, NY, 61.141.47.0/24]]

Создать pandas DataFrame

df = pd.DataFrame (данные, столбцы = ['ID', 'State', 'IP_su bnet'])

1 Ответ

0 голосов
/ 31 января 2020

Сначала с помощью 2 фреймов данных найдите состояние для каждого IP, затем создайте новый столбец на основе этих словарных данных и загрузите в исходный файл df.

Я думаю, что это можно сделать более компактным способом, но все же это делает задание.

import pandas as pd

data = [[1, 'CA', '192.168.1.0/24'], [2, 'TX', '172.68.7.0/24'], [3, 'NY', '61.141.47.0/24']]
df = pd.DataFrame(data, columns=['ID', 'State', 'IP_subnet'])
# replace end of IP
df['IP_subnet'] = df['IP_subnet'].str.replace(r'.0/24', '')

data2 = [[1, '61.141.47.1'], [2, '192.168.1.48'], [3, '172.68.7.124'], [4, '40.32.123.212']]
df2 = pd.DataFrame(data2, columns=['ID', 'IP'])

# match IP with state
data = {}
for index, row in df.iterrows():
    ww = df2[df2['IP'].str.contains(row['IP_subnet'])]
    data[ww['IP'].values[0]] = row['State']

# create State column
state_data = []
for index, row in df2.iterrows():
    if row['IP'] in data:
        state_data.append(data.get(row['IP']))
    else:
        state_data.append('NaN')

df2['State'] = state_data

Вывод:

   ID             IP State
0   1    61.141.47.1    NY
1   2   192.168.1.48    CA
2   3   172.68.7.124    TX
3   4  40.32.123.212   NaN
...