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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:36:04