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

Python在循环时将IP范围转换为CIDR表示法,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个带有IP信息的熊猫数据帧。目标是创建一个新的列“CIDR”,并转换“StartAddress”和“EndAddress”。有一个用于转换的python库“netaddr”。我有问题的while循环,它一直挂了很长一段时间。我以前遇到过这个问题,它通常是一个简单的解决方案,但我改变了while循环,却无法解决它。任何帮助都将不胜感激 “CIDR”列为空的数据: 守则: #Import libraries import pandas as pd from netaddr import * i

我有一个带有IP信息的熊猫数据帧。目标是创建一个新的列“CIDR”,并转换“StartAddress”和“EndAddress”。有一个用于转换的python库“netaddr”。我有问题的while循环,它一直挂了很长一段时间。我以前遇到过这个问题,它通常是一个简单的解决方案,但我改变了while循环,却无法解决它。任何帮助都将不胜感激

“CIDR”列为空的数据:

守则:

#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   
#导入库
作为pd进口熊猫
从NetAddress导入*
导入NetAddress
导入pprint
#读入数据
AS=pd.read_csv('BulkWhois/ARIN/AS8048.csv',sep='|',names=(“姓名”、“起始地址”、“结束地址”、“城市”、“国家代码”、“ASN”))
#删除IPV6所在的行
AS=AS[AS.EndAddress.str.contains(“:”==False]
#行数
lenth=len(AS)
#创建列“CIDR”
作为[“CIDR”]=“”
#While循环
索引=0
而(指数<长度):
AS[“CIDR”].iloc[index]=netaddr.iprange_to_cidrs(AS.StartAddress.iloc[index],AS.EndAddress.iloc[index])
索引=索引+1

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

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


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

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

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


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

您也可以使用for循环:

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

但张艺伦提出的解决方案更为优雅

您还可以使用for循环:

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

但张艺伦提出的解决方案更为优雅

这是非常快的,生产的正是我想要的。谢谢@Yilun Zhang,它的速度非常快,生产的正是我想要的。谢谢@Yilun Zhang
for i in AS.index:
    AS.loc[i, "CIDR"] = netaddr.iprange_to_cidrs(AS.loc[i, 'StartAddress'], AS.loc[i, 'EndAddress'])