python - 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)
预先感谢
解决方案
您可以使用
df[0].str.replace(fr"\b(?:{'|'.join([x for x in mapping])})\b", lambda x: mapping[x.group()])
正则表达式看起来像\b(?:sweatshirt|shirt)\b
,它将匹配sweatshirt
或shirt
作为整个单词。匹配项将传递给 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
推荐阅读
- azure-web-app-service - 无法在 Web 应用服务的部署中心授权一个驱动器
- scikit-learn - SkikitLearn 学习曲线强烈依赖于 MLPClassifier 的批量大小???或者:如何诊断 NN 的偏差/方差?
- spring - 如何通过@Cacheable 注解记录缓存命中?
- c - 使用 src 代码使用库而不安装它
- jakarta-ee - NullPointerException 从 EntityManagerFactory 创建 EntityManager
- ios - 无法使用 Xcode 10.2 构建
- reactjs - 内容更新字段
- android - 通过命令行启动我的虚拟 Android 设备
- java - 带有新行和连接的 JEditorPane
- php - JWT decode() 必须是数组错误类型