如何在Pandas python中使用另一个dataframe替换dataframe中的单词

6

我有两个数据框:

df

id   string_data
1    My name is Jeff
2    Hello, I am John
3    I like Brad he is cool.

另一个名为allnames的数据帧包含像这样的名称列表:

id  name
1   Jeff
2   Brad
3   John
4   Emily
5   Ross

我想将在allnames['name']中出现的所有单词替换为"Firstname",并且这些单词在df中出现。

预期输出:

id   string_data
1    My name is Firstname
2    Hello, I am Firstname
3    I like Firstname he is cool.

我尝试了这个:

nameList = '|'.join(allnames['name'])
df['string_data'].str.replace(nameList, "FirstName", case = False))

但它替换了近乎99%的单词。
1个回答

6

如果在Series.str.replace中添加单词边界的限制,您的解决方案应该可以工作:

nameList = '|'.join(r"\b{}\b".format(x) for x in allnames['name'])
df['string_data'] = df['string_data'].str.replace(nameList, "FirstName", case = False)
print (df)
   id                   string_data
0   1          My name is FirstName
1   2         Hello, I am FirstName
2   3  I like FirstName he is cool.

或者使用字典通过 getjoin 替换值:

d = dict.fromkeys(allnames['name'], 'Firstname')
f = lambda x: ' '.join(d.get(y, y) for y in x.split())
df['string_data'] = df['string_data'].apply(f)
print (df)
   id                   string_data
0   1          My name is Firstname
1   2         Hello, I am Firstname
2   3  I like Firstname he is cool.

编辑:你可以通过使用 lower 将所有值转换为小写:

d = dict.fromkeys([x.lower() for x in allnames['name']], 'Firstname')
f = lambda x: ' '.join(d.get(y.lower(), y) for y in x.split())
df['string_data'] = df['string_data'].apply(f)

嗨,我尝试了你的第一个解决方案。它将单词 That's 替换为 Firstnamehat's。其他单词都没问题,我现在会检查第二个和第三个解决方案。 - John Doe
@JohnDoe - 第一个解决方案应该失败了,所以已经移除。 - jezrael
发生这种情况是因为我有一个名为T的变量,但它仍然失败了。非常感谢。第二个解决方案完美地解决了问题。 - John Doe
1
嘿,第一种解决方案不区分大小写且非常慢。第二种解决方案区分大小写且速度快。有没有既不区分大小写又快速的解决方案? - John Doe
@jezrael 如果我将df1和allnames数据框放在2个Excel工作表中,我需要如何连接它们以获取结果集。 - mohan111

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接