@aaidlin

Как в Pandas преобразовать IP в CIDR?

Здравствуйте.
Есть датафрейм такого содержания:
num   ip            price
1      192.168.0.1    120
2        127.0.0.1    140
3      10.10.10.10    130
4      45.45.45.45    150
5          8.8.8.8    110
6          8.8.4.4     90
7   212.48.135.220    120


Нужно преобразовать IP в CIDR с маской /24.
Пробовал через "replace" и регулярку. Результат - IP заменяются регуляркой в той форме, как она была написана.
import pandas as pd
from pandasgui import show
df=pd.read_csv('test.csv', index_col=False)
df = df.astype({'ip':object})

df.replace({'ip': r'([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3}\.)[0-9]{1,3}'}, {'ip': r'([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3}\.)0/24'}, regex=True)


Также пробовал другие формы записи:
df['ip'].replace(to_replace='', value='', regex=True)
или
df['ip'].replace(to_replace=r'', value=r'', regex=True)
или
df['ip'].replace(to_replace=r'', value=r'')


Вывод после регулярки:
num    ip                                               price
1     ([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3}\.)0/24    120
2     ([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3}\.)0/24    140
3     ([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3}\.)0/24    130
4     ([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3}\.)0/24    150
5     ([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3}\.)0/24    110
6     ([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3}\.)0/24     90
7     ([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3}\.)0/24    120


Пока решил проблему проходом по csv файлу утилитой sed c этой же регуляркой, но хотелось бы делать все в Pandas. Плиз, посоветуйте, как решить проблему.
  • Вопрос задан
  • 45 просмотров
Решения вопроса 1
@o5a
Так у Вас там нет никакой замены, в строке замены снова указан шаблон поиска. Должно быть например так
df.replace({'ip': r'([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3}\.)[0-9]{1,3}'}, {'ip': r'\1\2\g<3>0/24'}, regex=True)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Посмотрите вот такую штуку:


ipaddress provides capabilities to work with IP addresses and networks (both IPv4 and IPv6).

ip = ipaddress.ip_address('127.0.0.1')
ip.is_private # True
ip.is_loopback # True
ip.is_global # False
ip.is_multicast # False
ip.is_reserved # False
ip.is_unspecified # False
ip.reverse_pointer # '1.0.0.127.in-addr.arpa'

net = ipaddress.ip_network('192.168.0.0/28')
net.is_private # True
net.hostmask # IPv4Address('0.0.0.15')
net.num_addresses # 16



Это из рассылки Вадима Пуштаева https://t.me/pythonetc
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы