如何从 Python 中的 CIDR 列表生成所有可能 IP 的列表,并从原始列表中为其分配另一列?
How can I generate a list of all possible IPs from a CIDR list in Python and assign another column to it from the original list?
我有一个 csv 文件,其中包含一列 CIDR IP 和一列,其中包含使用该 IP 的位置,如下所示:
| CIDR | Location |
| ------------ | ---------- |
| x.x.x.x/24 | OFFICE |
| x.x.x.x/24 | DATACENTER |
| x.x.x.x/25 | DATACENTER |
| x.x.x.x/26 | DATACENTER |
csv 继续,
我想从中创建一个新的 csv 文件,将 CIDR 扩展到所有可能的 IP,但仍然有正确的位置与之相关。
| IPs | Location |
| -------- | ------- |
| y.y.y.y | OFFICE |
| y.y.y.y | OFFICE |
| y.y.y.y | OFFICE |
| y.y.y.y | OFFICE |
| y.y.y.y | OFFICE |
等等
假设您的 DataFrame 具有 有效 CIDR,您可以合并 ipaddress.IPv4Network
and pandas.DataFrame.explode
:
import ipaddress
df2 = (df.assign(CIDR=df['CIDR'].map(lambda x: list(ipaddress.IPv4Network(x))))
.explode('CIDR')
)
示例输入:
df = pd.DataFrame({'CIDR': ['192.168.1.0/24', '10.0.0.0/24'],
'Location': ['OFFICE', 'DATACENTER']})
输出:
CIDR Location
0 192.168.1.0 OFFICE
0 192.168.1.1 OFFICE
0 192.168.1.2 OFFICE
0 192.168.1.3 OFFICE
0 192.168.1.4 OFFICE
.. ... ...
1 10.0.0.251 DATACENTER
1 10.0.0.252 DATACENTER
1 10.0.0.253 DATACENTER
1 10.0.0.254 DATACENTER
1 10.0.0.255 DATACENTER
[512 rows x 2 columns]
一种方法是使用 netaddr 模块并应用于 CIDR 列
>>> import netaddr
>>> data = {
'CIDR': ['10.0.0.0/29', '10.1.2.0/30', '192.168.1.0/29', '172.16.0.0/29'],
'Location': [ 'OFFICE', 'DATACENTER', 'DATACENTER', 'DATACENTER']}
>>> df = pd.DataFrame(data)
>>> pd.concat([df,df.CIDR.apply(netaddr.IPNetwork).explode().rename('IP')], axis=1)
CIDR Location IP
0 10.0.0.0/29 OFFICE 10.0.0.0
0 10.0.0.0/29 OFFICE 10.0.0.1
0 10.0.0.0/29 OFFICE 10.0.0.2
0 10.0.0.0/29 OFFICE 10.0.0.3
0 10.0.0.0/29 OFFICE 10.0.0.4
0 10.0.0.0/29 OFFICE 10.0.0.5
0 10.0.0.0/29 OFFICE 10.0.0.6
0 10.0.0.0/29 OFFICE 10.0.0.7
1 10.1.2.0/30 DATACENTER 10.1.2.0
1 10.1.2.0/30 DATACENTER 10.1.2.1
1 10.1.2.0/30 DATACENTER 10.1.2.2
1 10.1.2.0/30 DATACENTER 10.1.2.3
2 192.168.1.0/29 DATACENTER 192.168.1.0
2 192.168.1.0/29 DATACENTER 192.168.1.1
2 192.168.1.0/29 DATACENTER 192.168.1.2
2 192.168.1.0/29 DATACENTER 192.168.1.3
2 192.168.1.0/29 DATACENTER 192.168.1.4
2 192.168.1.0/29 DATACENTER 192.168.1.5
2 192.168.1.0/29 DATACENTER 192.168.1.6
2 192.168.1.0/29 DATACENTER 192.168.1.7
3 172.16.0.0/29 DATACENTER 172.16.0.0
3 172.16.0.0/29 DATACENTER 172.16.0.1
3 172.16.0.0/29 DATACENTER 172.16.0.2
3 172.16.0.0/29 DATACENTER 172.16.0.3
3 172.16.0.0/29 DATACENTER 172.16.0.4
3 172.16.0.0/29 DATACENTER 172.16.0.5
3 172.16.0.0/29 DATACENTER 172.16.0.6
3 172.16.0.0/29 DATACENTER 172.16.0.7
我有一个 csv 文件,其中包含一列 CIDR IP 和一列,其中包含使用该 IP 的位置,如下所示:
| CIDR | Location |
| ------------ | ---------- |
| x.x.x.x/24 | OFFICE |
| x.x.x.x/24 | DATACENTER |
| x.x.x.x/25 | DATACENTER |
| x.x.x.x/26 | DATACENTER |
csv 继续, 我想从中创建一个新的 csv 文件,将 CIDR 扩展到所有可能的 IP,但仍然有正确的位置与之相关。
| IPs | Location |
| -------- | ------- |
| y.y.y.y | OFFICE |
| y.y.y.y | OFFICE |
| y.y.y.y | OFFICE |
| y.y.y.y | OFFICE |
| y.y.y.y | OFFICE |
等等
假设您的 DataFrame 具有 有效 CIDR,您可以合并 ipaddress.IPv4Network
and pandas.DataFrame.explode
:
import ipaddress
df2 = (df.assign(CIDR=df['CIDR'].map(lambda x: list(ipaddress.IPv4Network(x))))
.explode('CIDR')
)
示例输入:
df = pd.DataFrame({'CIDR': ['192.168.1.0/24', '10.0.0.0/24'],
'Location': ['OFFICE', 'DATACENTER']})
输出:
CIDR Location
0 192.168.1.0 OFFICE
0 192.168.1.1 OFFICE
0 192.168.1.2 OFFICE
0 192.168.1.3 OFFICE
0 192.168.1.4 OFFICE
.. ... ...
1 10.0.0.251 DATACENTER
1 10.0.0.252 DATACENTER
1 10.0.0.253 DATACENTER
1 10.0.0.254 DATACENTER
1 10.0.0.255 DATACENTER
[512 rows x 2 columns]
一种方法是使用 netaddr 模块并应用于 CIDR 列
>>> import netaddr
>>> data = {
'CIDR': ['10.0.0.0/29', '10.1.2.0/30', '192.168.1.0/29', '172.16.0.0/29'],
'Location': [ 'OFFICE', 'DATACENTER', 'DATACENTER', 'DATACENTER']}
>>> df = pd.DataFrame(data)
>>> pd.concat([df,df.CIDR.apply(netaddr.IPNetwork).explode().rename('IP')], axis=1)
CIDR Location IP
0 10.0.0.0/29 OFFICE 10.0.0.0
0 10.0.0.0/29 OFFICE 10.0.0.1
0 10.0.0.0/29 OFFICE 10.0.0.2
0 10.0.0.0/29 OFFICE 10.0.0.3
0 10.0.0.0/29 OFFICE 10.0.0.4
0 10.0.0.0/29 OFFICE 10.0.0.5
0 10.0.0.0/29 OFFICE 10.0.0.6
0 10.0.0.0/29 OFFICE 10.0.0.7
1 10.1.2.0/30 DATACENTER 10.1.2.0
1 10.1.2.0/30 DATACENTER 10.1.2.1
1 10.1.2.0/30 DATACENTER 10.1.2.2
1 10.1.2.0/30 DATACENTER 10.1.2.3
2 192.168.1.0/29 DATACENTER 192.168.1.0
2 192.168.1.0/29 DATACENTER 192.168.1.1
2 192.168.1.0/29 DATACENTER 192.168.1.2
2 192.168.1.0/29 DATACENTER 192.168.1.3
2 192.168.1.0/29 DATACENTER 192.168.1.4
2 192.168.1.0/29 DATACENTER 192.168.1.5
2 192.168.1.0/29 DATACENTER 192.168.1.6
2 192.168.1.0/29 DATACENTER 192.168.1.7
3 172.16.0.0/29 DATACENTER 172.16.0.0
3 172.16.0.0/29 DATACENTER 172.16.0.1
3 172.16.0.0/29 DATACENTER 172.16.0.2
3 172.16.0.0/29 DATACENTER 172.16.0.3
3 172.16.0.0/29 DATACENTER 172.16.0.4
3 172.16.0.0/29 DATACENTER 172.16.0.5
3 172.16.0.0/29 DATACENTER 172.16.0.6
3 172.16.0.0/29 DATACENTER 172.16.0.7