Объединить два кадра данных в столбце IP-адрес - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть два DataFrames, df1 и df2, структурированные следующим образом:

ip_address            property_A
1.1.1.1               AAA
1.2.2.2               BBB
1.3.3.3               CCC
...                   ...
1.255.255.255.255     ZZZ

ip_address            property_B
1.1.1.1               YRG
1.2.2.2               HJK
1.3.3.3               KJH
...                   ...
1.255.255.255.255     TYU

И я хочу объединить их в столбце «ip_address».Из-за характера данных, содержащихся в этом столбце, эта команда не выполняется:

pd.merge(df1, df2, on='ip_address', how='inner')

>> dtype: object does not appear to be an IPv4 or IPv6 address

Возможным решением будет преобразование IP-адресов в целые числа с использованием модуля ipaddress, как в этом примере:

import ipaddress
int(ipaddress.IPv4Address('192.168.0.1'))

>> 3232235521

Чтобы сделать это эффективно, я попробовал эту команду:

import numpy as np
import pandas as pd
df1['int_ip'] = np.nan
df1.int_ip = int(ipaddress.IPv4Address(df1.ip_address))

Однако даже эта команда не работает:

>> AddressValueError: Expected 4 octets in [...]

Единственный подход, который кажетсявозможно следующее:

for i in range(0, df1.shape[0]):
    df1.int_ip[i] = int(ipaddress.IPv4Address(df1.ip_address[i]))

Но этот крайне неэффективен.

У вас есть лучший подход?

1 Ответ

0 голосов
/ 04 декабря 2018
d = {'ip_address': ['1.1.1.1', '2.2.2.2','3.3.3.3','1.255.255.255'], 'property_A': ['AAA','BBB','CCC','ZZZ']}
df1 = pd.DataFrame(data=d)
b = {'ip_address': ['1.1.1.1', '2.2.2.2','3.3.3.3','1.255.255.255'], 'property_B': ['YRG','HJK','KJH','TYU']}
df2 = pd.DataFrame(data=b)

Я бы попробовал это:

df3= df1.merge(df2.set_index('ip_address'),
               left_on=df1.ip_address,
               right_index=True)

df1
    ip_address    property_A
0   1.1.1.1       AAA
1   2.2.2.2       BBB
2   3.3.3.3       CCC
3   1.255.255.255 ZZZ

df2    
    ip_address    property_B
0   1.1.1.1       YRG
1   2.2.2.2       HJK
2   3.3.3.3       KJH
3   1.255.255.255 TYU

df3
    ip_address    property_A    property_B
0   1.1.1.1       AAA           YRG
1   2.2.2.2       BBB           HJK
2   3.3.3.3       CCC           KJH
3   1.255.255.255 ZZZ           TYU
...