[英]using pandas str.find method to slice strings in dataframe column
[英]Extracting 'n' characters from a column of a dataframe, based on 'find' results (Using str.contains() & str.find() with df.loc[]
如果“id”列包含“(插槽”,則應從“id”列的“輸出”列中提取插槽編號,否則如果“id”列包含“PR GRP”,則應在“輸出”中提取第一個插槽編號' 'grp' 列中的列。Slot No. 的位置是固定的,即在第一種情況下需要從找到 '(Slot' 的位置提取 7 個字符,然后刪除 '(' 以獲得插槽號。在第二種情況下 1st插槽號始終位於第 6 位,並且也將有 6 個字符。
id grp Output
Alpha-old-1_MOD (Slot01) - Slot01
Alpha-old-1_PR GRP1 MOD (Slot07);MOD (Slot08) Slot07
Beta-new-1_PR GRP2 MOD (Slot13);MOD (Slot14) Slot13
Beta-old-1_MOD (Slot03) - Slot03
預期 output:
]
嘗試使用str.extract
:
df["output"] = df["id"].str.extract("(Slot\d+)").fillna(df["grp"].str.extract("(Slot\d+)"))
>>> df
id grp output
0 Alpha-old-1_MOD (Slot01) - Slot01
1 Alpha-old-1_PR GRP1 MOD (Slot07);MOD (Slot08) Slot07
2 Beta-new-1_PR GRP2 MOD (Slot13);MOD (Slot14) Slot13
3 Beta-old-1_MOD (Slot03) - Slot03
使用正則表達式查找單詞 Slot 后跟 2 個數字
import re
data="""id\tgrp
Alpha-old-1_MOD (Slot01)\t-
Alpha-old-1_PR GRP1\tMOD (Slot07);MOD (Slot08)
Beta-new-1_PR GRP2\tMOD (Slot13);MOD (Slot14)
Beta-old-1_MOD (Slot03)\t-
"""
df=pd.read_csv(io.StringIO(data),sep='\t')
pattern=r"[\s\w\(]+(Slot{1}\d{2})+[\s\w\)]+"
df['output']=''
for key,row in df.iterrows():
if re.search("PR GRP",str(row['id'])):
matches=re.findall(pattern,str(row['grp']))
else:
matches=re.findall(pattern,str(row['id']))
if len(matches)>0:
df.loc[key,'output']=matches[0]
print(df[['id','grp','output']])
output:
id grp output
0 Alpha-old-1_MOD (Slot01) - [Slot01]
1 Alpha-old-1_PR GRP1 MOD (Slot07);MOD (Slot08) [Slot07]
2 Beta-new-1_PR GRP2 MOD (Slot13);MOD (Slot14) [Slot13]
3 Beta-old-1_MOD (Slot03) - [Slot03]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.