Python在循环时将IP范围转换为CIDR表示法

时间:2018-07-20 20:22:06

标签: python pandas dataframe

我有一个带有IP信息的熊猫数据框。目标是通过“ StartAddress”和“ EndAddress”的转换来创建新列“ CIDR”。有一个用于转换的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

代码:

#Import libraries
import pandas as pd
from netaddr import *
import netaddr
import pprint

#Read in data
AS = pd.read_csv('BulkWhois/ARIN/AS8048.csv', sep='|', names=("Name", "StartAddress", "EndAddress", "City", "CountryCode", "ASN"))

#Drop rows where IPV6
AS = AS[AS.EndAddress.str.contains(":") == False]

#Number of rows
lenth = len(AS)

#Create column "CIDR"
AS["CIDR"] = ""

#While loop
index = 0
while (index < lenth):
  AS["CIDR"].iloc[index] = netaddr.iprange_to_cidrs(AS.StartAddress.iloc[index], AS.EndAddress.iloc[index])    
  index=index + 1   

2 个答案:

答案 0 :(得分:2)

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

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

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

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

这立即给了我结果,因为while循环花了您的样本数据更长的时间。

答案 1 :(得分:1)

您还可以使用for循环:

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

但是张艺伦建议的解决方案更为优雅。