2016-02-11 48 views
-1

從這兩個字符串,我想捕捉的部分在第一行說:5X,但不是在第二行中的部分X50熊貓str.extract:空白外面正則表達式捕獲組拋出AttributeError的

"name" 
1 LONG YOX 5X AAA 
2 LONG YOX50 AAA 

對於pandas.DataFrame.loc操作,我使用numpy.where使用long_keyword上述部件提取與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: Can only use .str accessor with string values, which use np.object_ dtype in pandas

但是,當我使用相同的正則表達式沒有捕獲組的前導空格\s之外 - 即(\d+X|X\d+) - 我沒有得到任何錯誤。然而這意味着我不想要的那部分字符串將被包含在捕獲中。

問:我該如何解決這個錯誤?問題是空白\s還是我在捕獲組()之外有正則表達式標識符?

+1

請發佈[mcve]我們可以運行以複製問題。避免包含與問題無關的問題。 'df.loc'和'np.where'位看起來不像你的問題。你的snbtax和'np.where'的使用不正確。 'sourceString.str.extract'適用於我。 – Goyo

+0

@Goyo我修改了這個問題,並添加了更準確的細節。不知道是否改變了一切。 – Winterflags

+0

你的代碼引發了TypeError:'Series'對象是可變的,因此無論正則表達式如何,它們都不能被散列。無論如何,你不希望我能幫你調試一行280個字符長的代碼,有16個操作/屬性訪問/方法調用,是嗎?爲什麼你會一直髮布不可能產生你所描述的問題的代碼? – Goyo

回答

0

讓我們假設你有一個像這樣

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 

這是你想要的嗎?

+0

對不起,我看了你的代碼,但不知道它應該做什麼。我想要的是將字符串「5X」的一部分轉換爲「+500」。我編輯了這個問題以涵蓋更多的原始代碼。 – Winterflags

+0

''YOX50''不應該轉換爲'「+5000」'因爲數字之前沒有'\ s'。 – Winterflags