You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:25:35