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

如何在Pandas中根据Port列数字位数生成新列function_val

高效实现Pandas DataFrame的端口规则映射

问题描述

现有如下结构的Pandas DataFrame:

import pandas as pd

data = {
    'Server': ['Ser123', 'Ser123', 'Ser123', 'Ser123', 'Serabc', 'Serabc', 'Serabc', 'Serabc'],
    'Port': ['Ethernet3', 'Ethernet4', 'Ethernet12', 'Ethernet567', 'Ethernet2', 'Ethernet34', 'Ethernet458', 'Ethernet5689']
}
df = pd.DataFrame(data)

输出为:

Server         Port
0  Ser123    Ethernet3
1  Ser123    Ethernet4
2  Ser123   Ethernet12
3  Ser123  Ethernet567
4  Serabc    Ethernet2
5  Serabc   Ethernet34
6  Serabc  Ethernet458
7  Serabc Ethernet5689

需要新增function_val列,规则如下:

  • 若Port中“Ethernet”后为1位数字(如Ethernet2),对应值为'5k'
  • 若为2位数字(如Ethernet34),对应值为'10k'
  • 3位及以上数字则对应值为'20k'

最终目标DataFrame:

Server         Port function_val
0  Ser123    Ethernet3          5k
1  Ser123    Ethernet4          5k
2  Ser123   Ethernet12         10k
3  Ser123  Ethernet567         20k
4  Serabc    Ethernet2          5k
5  Serabc   Ethernet34         10k
6  Serabc  Ethernet458         20k
7  Serabc Ethernet5689         20k

用户尝试的代码

用户尝试了以下代码,但存在语法错误且未覆盖所有规则:

df['function_val']=np.where((df.Port.str.contains("Ethernet[0-9]"),'5k', df['function_val'])

高效实现方法

方法1:提取数字长度+np.select(推荐,清晰高效)

通过向量化操作提取数字部分并计算长度,再用np.select批量匹配规则,适合大规模数据集:

import numpy as np

# 提取Ethernet后的数字并计算长度
df['num_length'] = df['Port'].str.extract(r'Ethernet(\d+)')[0].str.len()

# 定义条件和对应值
conditions = [
    df['num_length'] == 1,
    df['num_length'] == 2
]
choices = ['5k', '10k']

# 生成function_val列
df['function_val'] = np.select(conditions, choices, default='20k')

# 可选:删除中间辅助列
df = df.drop('num_length', axis=1)

这种方法逻辑清晰,所有操作都是Pandas/Numpy的向量化运算,比逐行处理快得多。

方法2:正则匹配+嵌套np.where(简洁)

直接用正则匹配不同长度的数字,通过嵌套np.where实现规则映射,代码更紧凑:

df['function_val'] = np.where(
    df['Port'].str.match(r'Ethernet\d$'),  # 匹配1位数字结尾
    '5k',
    np.where(
        df['Port'].str.match(r'Ethernet\d{2}$'),  # 匹配2位数字结尾
        '10k',
        '20k'  # 其余情况默认20k
    )
)

适合条件较少的场景,代码行数少,但条件过多时可读性会下降。

方法3:apply逐行处理(不推荐大数据)

用apply调用自定义函数实现,代码直观但效率低,仅适合小数据集:

def get_func_val(port):
    num_part = port.replace('Ethernet', '')
    if len(num_part) == 1:
        return '5k'
    elif len(num_part) == 2:
        return '10k'
    else:
        return '20k'

df['function_val'] = df['Port'].apply(get_func_val)

apply是逐行遍历操作,数据量较大时速度远不如向量化方法。

内容的提问来源于stack exchange,提问作者user1471980

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 09:32:57