在pandas中对ip地址进行分类的好方法是什么?



我很难想出一个在pandas数据框架中对IP地址进行分类的解决方案。现在IPV4_SRC_ADDR是dtype对象。

这是我的数据集的组成:

IPV4_SRC_ADDR   L4_SRC_PORT     IPV4_DST_ADDR   L4_DST_PORT     PROTOCOL    L7_PROTO    IN_BYTES    OUT_BYTES   IN_PKTS     OUT_PKTS    TCP_FLAGS   FLOW_DURATION_MILLISECONDS  Label   Attack
0   59.166.0.3  11088   149.171.126.7   6881    6   37.0    1540    1644    16  18  27  106     0   Benign
1   59.166.0.7  34968   149.171.126.4   12113   6   11.0    4352    2976    28  28  27  313     0   Benign
2   59.166.0.3  34512   149.171.126.9   13754   6   11.0    4512    2456    18  18  27  5   0   Benign

假设我想在数据中包含所有IP范围为59.166.0的数据。X和149.171.126。X是服务器,10.40.85。X是客户机,在单独的列中。最好的办法是什么?

我已经尝试将第一列转换为新的列,并删除点,并将它们视为整数/浮点数。然后我尝试用lambda表示,如果x在y和z之间,它被归类为"服务器"。但后来我意识到这行不通,因为那个逻辑是不正确的。我很难想出另一个解决办法。

您可以将您的IP地址转换为整数:

import numpy as np
def ip2num(x):
"""Convert an IP Series or a string as numeric value."""
if isinstance(x, str):
return np.left_shift(np.array(x.split('.')).astype(int), [24, 16, 8, 0]).sum()
else:
return np.left_shift(x.str.split('.', expand=True).astype(int), [24, 16, 8, 0]).sum(axis=1)
df['IPV4_SRC_NUM'] = ip2num(df['IPV4_SRC_ADDR'])
df['IPV4_DST_NUM'] = ip2num(df['IPV4_DST_ADDR'])

输出:

>>> df.filter(like='IPV4')
IPV4_SRC_ADDR  IPV4_DST_ADDR  IPV4_SRC_NUM  IPV4_DST_NUM
0    59.166.0.3  149.171.126.7    1000734723    2511044103
1    59.166.0.7  149.171.126.4    1000734727    2511044100
2    59.166.0.3  149.171.126.9    1000734723    2511044105

现在,您可以过滤您的数据框架了:

>>> (ip2num('59.166.0.0') <= df['IPV4_SRC_NUM']) & (df['IPV4_SRC_NUM'] <= ip2num('59.166.0.255'))
0    True
1    True
2    True
Name: IPV4_SRC_NUM, dtype: bool

相关内容

最新更新