如何在Pandas DataFrame中按IP段将IP地址分类为服务器/客户端?
在Pandas DataFrame中分类IP地址的解决方案
需求回顾
基于IPV4_SRC_ADDR字段新增一列,标记IP所属角色:
59.166.0.X和149.171.126.X段IP → 标记为「服务器」10.40.85.X段IP → 标记为「客户端」- 其他IP → 标记为「未知」(可按需调整)
错误方法分析
你之前移除IP的点并转数值判断范围的逻辑不成立,因为IP是分段层级结构,直接拼接成数值会破坏网段边界规则(比如59.166.0.255和59.166.1.0拼接后数值大小无法反映实际网段差异)。
方法一:字符串前缀匹配(高效简洁,适合固定前缀场景)
利用Pandas向量化字符串操作直接匹配IP前缀,效率远高于逐行遍历,适合大数据集:
import pandas as pd # 假设数据集存储在df中 df['IP_ROLE'] = '未知' # 标记服务器IP(匹配两个前缀) server_prefixes = ('59.166.0.', '149.171.126.') df.loc[df['IPV4_SRC_ADDR'].str.startswith(server_prefixes), 'IP_ROLE'] = '服务器' # 标记客户端IP df.loc[df['IPV4_SRC_ADDR'].str.startswith('10.40.85.'), 'IP_ROLE'] = '客户端'
方法二:IP子网校验(严谨规范,适合复杂网段场景)
如果需要处理子网掩码(比如59.166.0.0/24)或IP合法性校验,使用Python内置ipaddress模块精确判断:
import pandas as pd import ipaddress def classify_ip(ip_str): try: ip = ipaddress.ip_address(ip_str) # 定义服务器子网 server_subnets = [ ipaddress.ip_network('59.166.0.0/24'), ipaddress.ip_network('149.171.126.0/24') ] # 定义客户端子网 client_subnet = ipaddress.ip_network('10.40.85.0/24') if any(ip in subnet for subnet in server_subnets): return '服务器' elif ip in client_subnet: return '客户端' else: return '未知' except ValueError: # 处理无效IP格式 return '无效IP' # 新增分类列 df['IP_ROLE'] = df['IPV4_SRC_ADDR'].apply(classify_ip)
方法选择建议
- 仅需固定前缀匹配时,优先选方法一,速度快且代码简洁;
- 需要处理子网、IP合法性校验等复杂场景时,选方法二,准确性更高。
内容的提问来源于stack exchange,提问作者Sven Wyseur
相关产品推荐
相关产品推荐

