[英]Mapping dictionary to partial string match in dataframe
我有以下df
ID Code
ABCD 00FQ
JKFA 8LK9|4F5H
QWST 2RLA|R1T5&8LK9
我正在嘗試 map 字典(其中值是List
)到Code
的各個元素。
字典看起來像這樣:
d={'00FQ':"['A','B']", '8LK9':"['X']", '4F5H':"['U','Z']", '2RLA':"['H','K']", 'R1T5':"['B','G']" }
我想 map 這個字典到Code
列中的每個元素,由|
分隔 .
生成的 df 如下所示:
ID Code Logic
ABCD 00FQ ['A','B']
JKFA 8LK9|4F5H ['X'] | ['U','Z']
QWST 2RLA|R1T5&8LK9 ['H','K'] | ['B','G'] & ['X']
IIUC split
+ replace
+ join
s=df.Code.str.split('|',expand=True).replace(d).stack().groupby(level=0).agg('|'.join)
s
Out[205]:
0 ['A','B']
1 ['X']|['U','Z']
2 ['H','K']|['B','G']
dtype: object
df['Logic']=s
更新
s=df.Code.str.split('|')
df['Logic']=['|'.join(d.get(y)for y in x) for x in s]
Out[229]: ["['A','B']", "['X']|['U','Z']", "['H','K']|['B','G']"]
更新replace
日期 2019-11-18(操作更改問題后)
df.Code.replace(d,regex=True)
Out[376]:
0 ['A','B']
1 ['X']|['U','Z']
2 ['H','K']|['B','G']&['X']
Name: Code, dtype: object
你可以使用str.replace 。
設置
import pandas as pd
df = pd.DataFrame(data=[['ABCD', '00FQ'], ['JKFA', '8LK9|4F5H'], ['QWST', '2RLA|R1T5&8LK9']], columns=['ID', 'Code'])
d = {'00FQ': "['A','B']", '8LK9': "['X']", '4F5H': "['U','Z']", '2RLA': "['H','K']", 'R1T5': "['B','G']"}
def r(w, d=d):
"""Function to be used for dictionary based replacement"""
return d[w.group()]
代碼
df['Logic'] = df['Code'].str.replace('[^|&]+', r).str.replace('([|&])', r' \1 ')
print(df)
Output
ID Code Logic
0 ABCD 00FQ ['A','B']
1 JKFA 8LK9|4F5H ['X'] | ['U','Z']
2 QWST 2RLA|R1T5&8LK9 ['H','K'] | ['B','G'] & ['X']
這個想法是首先替換所有不是|
或&
通過它在字典中的對應值(使用 function r
)。 完成后更換每個|
或&
(使用捕獲組)本身被空格( r' \1 ')
包圍。
請注意,在第一次調用中替換repl
參數是 function(可調用),這可以按照鏈接文檔中的說明進行:
可調用對象通過正則表達式匹配 object 並且必須返回要使用的替換字符串。 參見 re.sub()。
注意:此解決方案假定每個可能的代碼都在用於替換的字典中,如果不是這種情況, r
更改為:
def r(w, d=d):
"""Function to be used for dictionary based replacement"""
return d.get(w.group(), w.group())
有關正則表達式的更多信息,請參閱:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.