将字典映射到数据框中的部分字符串匹配

时间:2019-11-14 15:30:57

标签: python pandas

我有以下df

 ID       Code
ABCD      00FQ
JKFA    8LK9|4F5H
QWST    2RLA|R1T5&8LK9

我正在尝试将字典(值是List)映射到Code的各个元素。

字典看起来像这样:

d={'00FQ':"['A','B']", '8LK9':"['X']", '4F5H':"['U','Z']", '2RLA':"['H','K']", 'R1T5':"['B','G']" } 

我想将此字典映射到Code分隔的|列中的每个元素。

生成的df如下所示:

 ID       Code           Logic
ABCD      00FQ          ['A','B']
JKFA    8LK9|4F5H       ['X'] | ['U','Z']
QWST    2RLA|R1T5&8LK9  ['H','K'] | ['B','G'] & ['X']

2 个答案:

答案 0 :(得分:4)

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(在op更改了问题之后)

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

答案 1 :(得分:1)

您可以使用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)

输出

     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']

这个想法是首先用字典中的相应值替换|&以外的所有内容(使用函数r)。完成此操作后,将每个|&(使用capturing group)自己替换为由空格(r' \1 ')包围。

请注意,在第一次替换repl参数的调用是一个函数(可调用)时,可以按照链接文档中的说明进行操作:

  

可调用对象传递给正则表达式匹配对象,并且必须返回一个   要使用的替换字符串。参见re.sub()。

注意:此解决方案假定在替换字典中包含所有可能的代码,如果不是这种情况,请将r更改为:

def r(w, d=d):
    """Function to be used for dictionary based replacement"""
    return d.get(w.group(), w.group())

有关正则表达式的更多信息,请参见:

  1. Regular Expression HOWTO
  2. Speed up millions of regex replacements in Python 3