首页 > 解决方案 > pandas dataframe:根据dict替换单元格中的(独立)子字符串

问题描述

我想知道社区中是否有人可以提供以下帮助:

旨在正则表达式替换熊猫数据帧中的子字符串(基于我作为参数传递的字典)。虽然key:value 替换应该只发生,如果 dict键被发现是一个独立的子字符串(不是作为单词的一部分)。通过独立子字符串,我的意思是它在空格之后开始

前任:

mapping = {

   "sweatshirt":"sweat_shirt",
   "sweat shirt":"sweat_shirt",
   "shirt":"shirts"

}

df = pd.DataFrame([
         ["men sweatshirt"]
         ["men sweat shirt"]
         ["yellow shirt"]
       ])

df = df.replace(mapping,regex=True)

预期结果:运动衫中的子字符串“衬衫”不应替换为“衬衫”,因为值是另一个字符串的一部分,而不是独立值(\b)

注意:我传递的字典相当长,所以理想情况下,有一种方法可以将独立要求 (\b) 作为我传递的字典的一部分传递df.replace(dict, regex=True)

预先感谢

标签: pythonregexpandasdictionary

解决方案


您可以使用

df[0].str.replace(fr"\b(?:{'|'.join([x for x in mapping])})\b", lambda x: mapping[x.group()])

正则表达式看起来像\b(?:sweatshirt|shirt)\b,它将匹配sweatshirtshirt作为整个单词。匹配项将传递给 lambda,并使用 获取相应的值mapping[x.group()]

多词搜索词更新

由于您可能需要在mapping键中搜索多字词,因此应确保最长的搜索词在交替组中排在首位。那是,\b(?:abc def|abc)\b而不是\b(?:abc|abc def)\b

import pandas as pd

mapping = {
   "sweat shirt": "sweat_shirt",
   "shirt": "shirts"
}

df = pd.DataFrame([
         ["men sweatshirt"],
         ["men sweat shirt"]
       ])
rx = fr"\b(?:{'|'.join(sorted([x for x in mapping],key=len,reverse=True))})\b"
df[0].str.replace(rx, lambda x: mapping[x.group()])

输出:

0     men sweatshirt
1    men sweat_shirt
Name: 0, dtype: object

推荐阅读