我有一個熊貓資料框:
col1
johns id is 81245678316
eric bought 82241624316 yesterday
mine is87721624316
frank is a genius
i accepted new 82891224316again
我想根據 col1 創建帶有虛擬變數 (0,1) 的新列。如果有 11 個以 8 開頭并連續的數字,則必須為 1,否則為 0。
所以我寫了這段代碼:
df["is_number"] = df.col1.str.contains(r"\b8\d{10}").map({True: 1, False: 0})
但是輸出是:
col1 is_number
johns id is 81245678316 1
eric bought 82241624316 yesterday 1
mine is87721624316 0
frank is a genius 0
i accepted new 82891224316again 0
如您所見,第三行和第五行在“is_number”中有 0,但我希望它們有 1,即使在某些地方的單詞和數字之間缺少空格。怎么做?我想:
col1 is_number
johns id is 81245678316 1
eric bought 82241624316 yesterday 1
mine is87721624316 1
frank is a genius 0
i accepted new 82891224316again 1
uj5u.com熱心網友回復:
解決方案可以像您的一樣簡單,但'\b'必須洗掉它,因為它必須匹配單詞邊界:
df.col1.str.contains("8\d{10}").astype(int)
如果您只需要 11 位數字,而不是更多,則要求 11 位數字之前和之后的符號不存在或不是數字:
df.col1.str.contains("(^|\D)8\d{10}($|\D)").astype(int)
uj5u.com熱心網友回復:
您可以使用數字邊界,因為輸入中的數字可以“粘合”到字母(即單詞邊界,因此字母和 之間沒有單詞邊界8):
df["is_number"] = df['col1'].str.contains(r"(?<!\d)8\d{10}(?!\d)").map({True: 1, False: 0})
輸出:
>>> df
col1 is_number
0 johns id is 81245678316 1
1 eric bought 82241624316 yesterday 1
2 mine is87721624316 1
3 frank is a genius 0
4 i accepted new 82891224316again 1
請參閱正則運算式演示。
uj5u.com熱心網友回復:
您只需要洗掉\bwhich 代表,word boundary因為您不在乎是否有邊界。
df["is_number"] = df.col1.str.contains(r"8\d{10}").map({True: 1, False: 0})
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/419694.html
標籤:
上一篇:簡化決議的正則運算式
