我有以下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']
答案 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())
有关正则表达式的更多信息,请参见: