Python преобразовывает диапазон IP-адресов в нотацию CIDR while loop

У меня есть фреймворк pandas с 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

Код:

#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   
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
338
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я запустил вашу функцию и цикл while, и он работал, но немного медленнее. Вероятно, ваша проблема в том, что он запускается слишком долго.

Я бы посоветовал вам написать функцию и использовать df.apply():

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

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

Это дало мне мгновенный результат, тогда как цикл while занял гораздо больше времени в ваших выборочных данных.

Это очень быстро и произвело именно то, что я искал. Спасибо @Yilun Zhang

sectechguy 20.07.2018 23:11

Вы также можете использовать цикл for:

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

Но решение, предложенное Илунь Чжаном, более элегантно.

Другие вопросы по теме