簡體   English   中英

將字典映射到 dataframe 中的部分字符串匹配

[英]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())

有關正則表達式的更多信息,請參閱:

  1. 正則表達式 HOWTO
  2. 加速 Python 3 中的數百萬個正則表達式替換

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM