Pandas DataFrame按正则匹配提取字符串前两位的代码失效问题
问题原因与修正方案
1. 条件判断逻辑错误
你写的if df["ccv"].item == True:存在两个核心问题:
- pandas的Series对象不存在
item属性,你访问的是不存在的属性,返回值恒为None,None == True永远为假,所以if块内的代码从未执行,自然不会生成目标列。 - 普通if判断是对整个Series做全局判断,无法逐行处理5万多行的表格数据,必须用pandas向量化操作实现逐行条件判断。
2. ccv列全为False的原因
- 你当前提供的样本数据本身不符合规则:比如
Olr的首字符O、AG@的首字符A都不在你定义的第一字符集合[ptkbdgG_fvsSxzZhmnNJlrwj]范围内,匹配失败属于正常情况。 - 正则匹配逻辑有缺陷:
str.contains默认匹配任意子串,你没有强制匹配整个3位字符的结构,同时没有处理ITEM长度不足3的异常情况,容易出现误判。
修正后代码
import pandas as pd import numpy as np # 提取前三位字符 df['first_three_symbols'] = df['ITEM'].str[0:3] # 修正正则匹配:加^$锚定整串匹配,加na=False处理长度不足3的情况 pattern = r'^[ptkbdgG_fvsSxzZhmnNJlrwj]{2}[IEAOYye|aouKLM@)3*<!(#0~q^LMOEK]$' df["ccv"] = df["first_three_symbols"].str.contains(pattern, na=False) # 向量化条件赋值生成目标列,不符合条件的位置填充空值 df['first_two_symbols'] = np.where(df['ccv'], df['ITEM'].str[0:2], pd.NA)
可选简化方案
如果你不需要保留中间列,可以直接一步生成目标列:
# 用正则捕获组直接提取符合要求的前两位字符 pattern = r'^([ptkbdgG_fvsSxzZhmnNJlrwj]{2})[IEAOYye|aouKLM@)3*<!(#0~q^LMOEK]' df['first_two_symbols'] = df['ITEM'].str.extract(pattern, expand=False)
该写法会自动把匹配到的前两位提取出来,未匹配的位置自动填充NaN,不需要额外写条件判断。
内容的提问来源于stack exchange,提问作者lubalubalubakit
相关产品推荐
相关产品推荐

