如何迭代 IP 并将其与 python 中的 IP 范围 (cidr) 匹配?
How do I iterate and match an IP against IP ranges (cidr) in python?
我有一个 table 和 'State'
并且关联的 IP CIDR 范围与该状态关联。
TABLE一个
--------------------------------------------------
| 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 |
--------------------------------------------------
我想遍历下面的 table 并将 IP
字段与 IP_subnet
字段匹配。
TABLEB
| 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 == 范围 [172.68.7.0 到 172.68.7.255]
初始化列表列表
data = [[1, 'CA', '192.168.1.0/24'], [2, 'TX', '172.68.7.0/24'], ['juli' , 14], [3, 纽约州, 61.141.47.0/24]]
创建 pandas 数据框
df = pd.DataFrame(数据,列 = ['ID', 'State', 'IP_subnet'])
首先使用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
我有一个 table 和 'State'
并且关联的 IP CIDR 范围与该状态关联。
TABLE一个
--------------------------------------------------
| 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 |
--------------------------------------------------
我想遍历下面的 table 并将 IP
字段与 IP_subnet
字段匹配。
TABLEB
| 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 == 范围 [172.68.7.0 到 172.68.7.255]
初始化列表列表
data = [[1, 'CA', '192.168.1.0/24'], [2, 'TX', '172.68.7.0/24'], ['juli' , 14], [3, 纽约州, 61.141.47.0/24]]
创建 pandas 数据框
df = pd.DataFrame(数据,列 = ['ID', 'State', 'IP_subnet'])
首先使用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