[英]Remove last part of string in column if strings match pattern in pandas
如果字符串與指定的模式匹配,我正在嘗試刪除字符串的結尾部分。
這些是我正在使用的兩種字符串格式:
ColA
2-OX-1011054-LWJ04-HT-01
2-VH-0611052-LWJ04-HT-001
我想從兩者中刪除-01
和-001
。
我知道我可以寫一些東西來刪除最后一個之后的所有內容-
但是在不同模式的那一列中有很多其他字符串,如果我這樣做會搞砸。
因此,如果字符串與模式完全匹配,我只想刪除最后一部分。
我以前用過這樣的東西,但我不是 100% 確定它是如何工作的,但我猜它可以重構為我的目的:
report['ColA'] = report['ColA'].str.replace(r'(?<=^\w{2}-\d{5}-\d{3})(-\d+)', '', regex=True)
編輯:應該指定並非所有的結束號碼都是01
或001
。 它可以是從000
到999
的任何數字
report['ColA'] = report['ColA'].str.replace(r'(?<=^\d{1}-\w{2}-\d{7}-\w{3}\d{2}-\w{2})(-\d+)', '', regex=True)
嘗試
report['ColA'] = report['ColA'].str.replace(r'-0{1,2}1', '', regex=True)
它僅適用於-01
和-001
。 是你想要的嗎?
編輯
如果它是任何數字,這應該工作
report['ColA'] = report['ColA'].str.replace(r'-\d+$', '', regex=True)
str.rsplit
從右側拆分如何,但使用 boolean 掩碼來決定刪除哪個以及保留哪個?
splits = report['ColA'].str.rsplit('-', 1)
mask = splits.str[-1].isin(['01','001'])
report.loc[mask, 'ColA'] = splits[mask].str[0]
Output:
ColA
0 2-OX-1011054-LWJ04-HT
1 2-VH-0611052-LWJ04-HT
“在那一列不同的模式中有很多其他的字符串”
您可以使用:
report['ColA'] = report['ColA'].str.replace(r'^(\d+-[A-Z]{2}-\d{7}-[A-Z]{3}\d\d-[A-Z]{2})-\d{1,3}$', r'\1', regex=True)
模式^(\d+-[AZ]{2}-\d{7}-[AZ]{3}\d\d-[AZ]{2})-\d{1,3}$
表示:
^
- 起跑線錨;(
- 打開第一個捕獲組;
\d+
- 1+ 位(如果您確定這將始終只是一個數字,請刪除“+”);-[AZ]{2}
- 文字連字符后跟兩個大寫字母字符;-\d{7}
- 一個連字符后跟 7 位數字;-[AZ]{3}\d\d
- 文字連字符后跟三個大寫字母字符和兩個數字;-[AZ]{2}
- 文字連字符后跟兩個大寫字母字符;)
- 關閉第一個捕獲組;-\d{1,3}
- 一個連字符,后跟一到三位數字;$
- 結束線錨。我們使用第一個捕獲組的內容來替換整個(匹配的)字符串。 通過這種方式,您已驗證您僅在需要時替換那些數字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.