pandas 如果列列表包含子字符串[duplicate],则将值分配给来自不同数据报的新列

7fyelxc5  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(104)

此问题在此处已有答案

is it possible to do fuzzy match merge with python pandas?(共15个答案)
2天前关闭。
这篇文章在2天前被编辑并提交审查。
我有两个 Dataframe :

df1 = pd.DataFrame(list(zip(['name1, Name2, name5', 'name4, name3', 'name6xx'],
                            [150, 230, 'name6xx'])),
                    columns=['name', 'compound1'])
df1

df2 = pd.DataFrame(list(zip(['name1 ppl', 'PPL name2', 'Name3 PPL', 'name4 ppl', 'name5 ppl', 'name6xx'])), columns=['name'])
df2

第一次
如何根据df1.name列表为df2赋值?
我想要一张这样的table:

df2 = pd.DataFrame(list(zip(['name1 ppl', 'PPL name2', 'Name3 PPL', 'name4 ppl', 'name5 ppl', 'name 6xx'],
                           [150,150,230,230,150,'name6xx'])),
                    columns=['name', 'compound'])
df2

下面是我的代码:

def match(name):
    cond = df1['name'].str.contains(name, case=False)[0]
    if cond:
        return df1.loc[cond, 'compound1'].values[0]
    else:
        return name
df2.compound_new = df2.name.apply(match)
z31licg0

z31licg01#

您可以创建一个正则表达式,extract值和map匹配:

import re

s = (df1.assign(name=df1['name'].str.lower().str.split(',\s*'))
        .explode('name').set_index('name')['compound1']
    )

regex = '|'.join(map(re.escape, s.index))

# 'name1|name2|name3|name4|name5|name6xx'

df2['compound'] = (df2['name'].str.lower()
                   .str.extract(f'({regex})', expand=False)
                   .map(s)
                  )

输出:

name compound
0  name1 ppl      150
1  PPL name2      150
2  Name3 PPL      150
3  name4 ppl      230
4  name5 ppl      230
5    name6xx  name6xx

相关问题