我正在為個人專案清理資料,并且正在標準化大量類別。看似低垂的果實有足夠相似的名稱,例如:
“可疑的工藝”、“可疑的武裝分子”、“可疑的海盜”、“可疑的恐怖分子”、“可疑的方法”、“可疑的方法”、“可疑的方法”、“可疑的方法”、“可疑的船”、“可疑的船”, “可疑工藝”、“可疑工藝”、“可疑容器”、“可疑方法”、“可疑方法”、“可疑方法”、“可疑工藝”、“可疑方法”
還有其他的,包括小寫和混合大小寫的,所以我使用的是正則運算式。我可以選擇我要查找的內容(請注意,我添加了 #8619:
df[df["hostility"].str.contains(r"^Su(s|c)(p|])(i|e)", regex=True, case=False)]
year hostility victim
878 2018 Suspicious Approach Tug
7060 2001 SUSPICIOUS CRAFT MERCHANT VESSEL
7068 2001 Suspicious group onboard a trawler YACHT
7723 2000 SUSPICIOUS CRAFT MERCHANT VESSEL
8619 2004 Protest tug
10001 2003 SUSPICIOUS CRAFT MERCHANT VESSEL
但我堅持替換所有的變化,以便他們喜歡這樣:
year hostility victim
878 2018 Suspicious Approach Tug
7060 2001 Suspicious Approach MERCHANT VESSEL
7068 2001 Suspicious Approach YACHT
7723 2000 Suspicious Approach MERCHANT VESSEL
8619 2004 Protest tug
10001 2003 Suspicious Approach MERCHANT VESSEL
這樣做最有效的是什么?
uj5u.com熱心網友回復:
您可以直接使用矢量化Series.str.replace方法來替換以您選擇的模式開頭的整個字串。請注意,使用具有單個字符替代的組效率不高,正則運算式為此提供了字符類。例如,不要使用(c|d),[cd]而是使用更有效的方法(請參閱為什么字符類比交替更快?)。
所以,你可以使用
df['hostility'] = df['hostility'].str.replace(r'(?i)^Su[sc][][p][ie].*', 'Suspicious Approach', regex=True)
(?i)請注意,由于使用了inline 修飾符,正則運算式不區分大小寫,regex=True并使該方法將搜索引數視為正則運算式。
詳情:
(?i)- 不區分大小寫的修飾符^- 字串的開始Su-Su字串[sc]-s或c[][p]-或char (請注意],您不必在字符類中轉義,并且如果它位于字符類的起始位置)[p[][ie]-i或e.*- 該行的其余部分(如果您需要匹配換行符,請替換(?i)為(?si)并且.也將匹配換行符)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/474537.html
