我有一個單詞串列和一個資料集。我想確定資料集中至少包含串列中兩個單詞的行。
我能夠識別包含至少兩個串列詞的行,但我的代碼也有問題地識別了重復單個串列詞的行。
這是我的代碼:
import pandas as pd
data={'Name':['Redred','redblue','redgreen','blue']}
df=pd.DataFrame(data)
df['Good colours'] = (df['Name'].str.contains("(red.*|blue.*|green.*){2,}",case=False, regex=True))
print(df)
在結果資料集中,“redred”行在不應該回傳 true 時回傳 true。
為了排除重復的單詞,我嘗試過,(red.*){1,}(blue.*){1,}(green.*){1}但這意味著不再識別“redblue”和“redgreen”(并且代碼識別這些行是必不可少的。)
如何撰寫正則運算式,以便識別串列詞的兩個實體,同時排除串列詞的重復實體?
uj5u.com熱心網友回復:
您可以使用
(df['Name'].str.contains(r"^(?!(red|blue|green)\1 $)(?:.*(?:red|blue|green)){2}",case=False, regex=True))
如果您的字串只能由串列中的單詞組成,請洗掉.*,并替換{2}為{2,}$:
(df['Name'].str.contains(r"^(?!(red|blue|green)\1 $)(?:red|blue|green){2,}$",case=False, regex=True))
詳情:
^- 字串的開始(?!(red|blue|green)\1 $)- 如果有,則匹配失敗的負前瞻(red|blue|green)- 組 1:組中定義的任何子串\1- 一次或多次重復第 1 組值,然后$- 字串結束
(?:.*(?:red|blue|green)){2}- 除換行符以外的零個或多個字符的兩次出現,盡可能多,然后是組中定義的子字串的一次出現。(?:red|blue|green){2,}$- 組中單詞出現兩次或多次,然后是字串結尾。
請參閱正則運算式演示 #1和正則運算式演示 #2。
uj5u.com熱心網友回復:
有時正則運算式不是這項作業的工具。
我會簡單地使用單獨的呼叫來確定哪些行包含紅色、綠色和藍色,然后查看哪些行至少在其中兩個組中。
def name_has_color(df, color):
return df['Name'].str.contains(color, case=False).astype(int)
color_counts = sum(
name_has_color(df, color)
for color in ['red', 'green', 'blue']
)
df['good_colors'] = df[color_counts >= 2]
這種方法自然是可擴展的,如果您需要檢查大量包含的值或是否有更多的值,則不會變得更復雜。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/400747.html
