Python将IP范围转换为CIDR符号while循环

2024-10-03 00:31:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含IP信息的熊猫数据帧。目标是创建一个新的列“CIDR”,其中包含“StartAddress”和“EndAddress”的转换。有一个python库用于转换,“netaddr”。我对while循环有问题,它长时间挂起。我以前遇到过这个问题,它通常是一个简单的修复方法,但是当我改变while循环时,我就搞不懂了。任何帮助都将不胜感激。在

“CIDR”列为空的数据:

    Name                    StartAddress    EndAddress  City    CountryCode ASN CIDR
0   LACNIC-ERX-128-201-0-0  128.201.0.0 128.201.255.255 Montevideo  \N  AS8048  
1   LN-ERX-129-90-0-0       129.90.0.0  129.90.255.255  Montevideo  \N  AS8048  
2   LACNIC-ERX-131-0-0-0    131.0.0.0   131.0.255.255   Montevideo  \N  AS8048  
3   LACNIC-ERX-131-100-0-0  131.100.0.0 131.100.255.255 Montevideo  \N  AS8048  
4   LACNIC-ERX-131-108-0-0  131.108.0.0 131.108.255.255 Montevideo  \N  AS8048  
5   LACNIC-ERX-131-161-0-0  131.161.0.0 131.161.255.255 Montevideo  \N  AS8048  
6   LACNIC-ERX-131-178-0-0  131.178.0.0 131.178.255.255 Montevideo  \N  AS8048  
7   LACNIC-ERX-131-196-0-0  131.196.0.0 131.196.255.255 Montevideo  \N  AS8048  
8   LACNIC-ERX-131-221-0-0  131.221.0.0 131.221.255.255 Montevideo  \N  AS8048  
9   LACNIC-ERX-131-255-0-0  131.255.0.0 131.255.255.255 Montevideo  \N  AS8048

代码:

^{pr2}$

Tags: 数据方法nameip信息目标cidrwhile
2条回答

也可以使用for循环:

for i in AS.index:
    AS.loc[i, "CIDR"] = netaddr.iprange_to_cidrs(AS.loc[i, 'StartAddress'], AS.loc[i, 'EndAddress']) 

但张怡伦提出的解决方案更为优雅。在

我运行了你的函数和while循环,它正在工作,但有点慢。可能你的问题是跑的时间太长了。在

我建议您编写一个函数并使用df.apply()

def helper(row):
    return netaddr.iprange_to_cidrs(row.StartAddress, row.EndAddress)    

df["CIDR"] = df.apply(helper, axis=1) 

这给了我一个结果,while循环在示例数据上花费了更长的时间。在

相关问题 更多 >