查找并替换列表中的部分值

Look up and replace partial values in a list

我有列表 A,其中包含以“|”分隔的值看起来像这样

df1['original']= ['aaa|bbb|ccc','aaa|ccc','aaa|ccc|ddd']

输出:

aaa|bbb|ccc
aaa|ccc
aaa|ccc|ddd

在另一个df中,我还有另外两列。第一个看起来像这样:df1['title']=['aaa','bbb','ccc','ddd']。 相应地,我在 df1['title'] 旁边还有一列。 df1['new_value']=['x','y','z','w'].

输出:

title new_value
aaa      x
bbb      y
ccc      z
ddd      w

我想搜索df1['original']中的每个值,并替换为基于df1['title']df1['new_value']的搜索结果。我想保留原始列中的|。最终输出应如下所示:

df1['New']=['x|y|z','x|z','x|z|w']

输出: 新

x|y|z
x|z
x|z|w

这更像是 excel 中的条件查找以及如何在 python 中实现此目的的任何想法?

感谢您的宝贵时间!

下面的link只能匹配包含一个值的。 查找并替换列表中的值 (pandas)

这个使用 format 方法的邪恶黑客怎么样?

In = ['aaa|bbb|ccc','aaa|ccc','aaa|ccc|ddd']
replace = 'aaa x bbb y ccc z ddd w'
# use the infamous grouper (if you have keys and values in separate
# lists you don't need this) to get a dict:
replace = iter(replace.split())
replace = dict(zip(*2*(replace,)))
# enclose all templates with curlies 
# like 'aaa|bbb|ccc' -> '{aaa}|{bbb}|{ccc}'
# and use .format
Out = [('{' + s.replace('|', '}|{') + '}').format(**replace) for s in In]
# ['x|y|z', 'x|z', 'x|z|w']

仅在 Python 中,您可以有条不紊地执行以下操作:

创建字典(这与Pandas数据框非常相似):

df1={}
df1['original']= ['aaa|bbb|ccc','aaa|ccc','aaa|ccc|ddd']
df1['title']=['aaa','bbb','ccc','ddd']
df1['new_value']=['x','y','z','w']

创建旧映射到新字典:

di=dict(zip(df1['title'], df1['new_value']))

创建描述的新字典条目:

nl=[]
for sl in [s.split('|') for s in df1['original']]:
    nl.append([di[e] for e in sl])

df1['New']=['|'.join(e) for e in nl]
# {'New': ['x|y|z', 'x|z', 'x|z|w'],...}

让我们用replace

df1['New']=df1.original.replace(df2.set_index('title').new_value.to_dict(),regex=True)
df1
Out[758]: 
      original    New
0  aaa|bbb|ccc  x|y|z
1      aaa|ccc    x|z
2  aaa|ccc|ddd  x|z|w