Python Pandas str.extract for np.where:正则表达式捕获组外的空格抛出AttributeError

Python Pandas str.extract for np.where:正则表达式捕获组外的空格抛出AttributeError,python,regex,numpy,pandas,Python,Regex,Numpy,Pandas,从这两个字符串中,我想捕捉到第一行中说5X的部分,而不是第二行中说X50的部分: "name" 1 LONG YOX 5X AAA 2 LONG YOX50 AAA 对于pandas.DataFrame.loc操作,我使用numpy.where提取上述部分,使用long\u关键字作为正则表达式的定位器str.extract: long_keyword = df.loc[df["name"].str.contains("LONG", case=False), "name"] d

从这两个字符串中,我想捕捉到第一行中说
5X
的部分,而不是第二行中说
X50
的部分:

    "name"
1   LONG YOX 5X AAA
2   LONG YOX50 AAA
对于
pandas.DataFrame.loc
操作,我使用
numpy.where
提取上述部分,使用
long\u关键字作为正则表达式的定位器
str.extract

long_keyword = df.loc[df["name"].str.contains("LONG", case=False), "name"]

df.loc[df["name"].str.contains(long_keyword, case=False), "result_column"] = np.where(long_keyword.str.extract(r"\s(\d+X|X\d+)", flags=re.IGNORECASE).str.strip("Xx").str.isdigit(), "+" + long_keyword.str.extract(r"\s(\d+X|X\d+)", flags=re.IGNORECASE).str.strip("Xx") + "00", "+100")
当我使用正则表达式
\s(\d+X | X\d+
时,我得到:

AttributeError:只能使用带字符串值的.str访问器,该访问器在pandas中使用np.object\dtype

但是当我使用相同的正则表达式时,在捕获组之外没有前导空格
\s
,即
(\d+X | X\d+
),我没有得到任何错误。但是,这意味着我不想要的字符串部分将包含在捕获中


Q:如何修复此错误?问题是空格
\s
还是在捕获组
()
之外有正则表达式标识符?

假设您有这样一个文件

10,"ABC YOX 5X AAA"
20,"ABC YOX50 AAA"
           string
10  ABC YOX 5X AAA
20   ABC YOX50 AAA
所以,数据框看起来像这样

10,"ABC YOX 5X AAA"
20,"ABC YOX50 AAA"
           string
10  ABC YOX 5X AAA
20   ABC YOX50 AAA
你想要这个

df['size']=df['string'].apply(lambda x: len(x.split()))
df['interest']=df[df['size']==4]['string'].str.split(" ").str.get(2)
输出

           string  size interest
10  ABC YOX 5X AAA     4       5X
20   ABC YOX50 AAA     3      NaN

这就是您想要的吗?

请发布一个我们可以运行以复制问题的日志。避免包含与问题无关的问题。
df.loc
np.where
位看起来与您的问题无关。您的snbtax和
np.where
的使用不正确。
sourceString.str.extract
适合我。@Goyo我已经修改了这个问题并添加了更准确的细节。但是,不确定这是否会改变什么。您的代码会引发
TypeError:“Series”对象是可变的,因此无论正则表达式是什么,都无法对它们进行哈希处理。无论如何,你不希望我帮你调试一行280个字符长的代码,有16个操作/属性访问/方法调用,是吗?你为什么一直发布不可能产生你所描述的问题的代码?@Goyo我对你没有任何期望,是你回答了我的问题。对不起,这很讽刺。问题的关键是,不可能用您发布的代码复制您描述的问题,因此我无法提供帮助。我甚至不能确定你的问题到底是什么。对不起,我看过你的代码,但不确定它应该做什么。我想要的是将字符串的部分
“5X”
转换为
“+500”
。我对问题进行了编辑,以涵盖更多原始代码。
“YOX50”
不应转换为
“+5000”
,因为数字前没有
\s