Pandas根据devicename子串及make列值生成devicevalue新列问题
解决方案
核心修改逻辑:原函数从字符串末尾倒序提取数字的逻辑无法适配带后缀的设备名,改为用正则表达式直接匹配switch关键字后紧跟的连续数字段,即可忽略后续所有非数字后缀,稳定拿到目标数值。
最小修改版本(兼容原有代码结构)
只需要修改get_number_suffix函数即可,其余代码无需变动:
import re def get_number_suffix(devicename: str) -> int: # 匹配switch后紧跟的连续数字,忽略后续所有字符 match_res = re.search(r"switch(\d+)", devicename) # 若匹配失败可根据业务需求调整默认返回值,这里默认返回0 return int(match_res.group(1)) if match_res else 0 def compute_devicevalue(row) -> int: if 'netgear' in row['make']: return 0 return 1 if get_number_suffix(row['devicename']) >=20 else 0 df['devicevalue'] = df.apply(compute_devicevalue, axis=1)
更高性能的向量化版本(适合大数据量场景)
避免使用行遍历的apply方法,直接用pandas内置的向量化操作,执行效率提升明显:
import re import pandas as pd # 初始化默认值为0(netgear设备直接保留默认值即可) df['devicevalue'] = 0 # 仅处理非netgear的设备 cisco_rows = df['make'] != 'netgear' df.loc[cisco_rows, 'devicevalue'] = ( df.loc[cisco_rows, 'devicename'] .str.extract(r"switch(\d+)", expand=False) .astype(int) >= 20 ).astype(int)
两种方案都可以正确处理带-new、字母后缀的设备名,比如switch23-new会提取到23,switch40e会提取到40,完全符合赋值规则要求。
内容的提问来源于stack exchange,提问作者Uggers
相关产品推荐
相关产品推荐

