如何在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
相关产品推荐
相关产品推荐

