Python Pandas 和正则表达式使用字典替换 Dataframe 中的项目
Posted
技术标签:
【中文标题】Python Pandas 和正则表达式使用字典替换 Dataframe 中的项目【英文标题】:Python Pandas and regex in replacing items in Dataframe using dictionary 【发布时间】:2021-12-22 08:24:36 【问题描述】:您好,我正在尝试使用 Python Pandas 中的字典重新映射 Dataframe,但我需要使用正则表达式才能正常工作。
这里是一个字典示例:
di_cities =
"Ain Salah (town)": "Ain Salah"
"Agadez town": "Agadez"
"Bamako city": "Bamako",
"Birnin Konni town": "Birni N Konni",
"Konni": "Birni N Konni",
"Kadunà": "Kaduna",
"Kaduna (city)": "Kaduna",
"Kano (city)": "Kano"
"Matamey": "Matamey",
"Mopti city": "Mopti"
"N'guigmi": "Nguigmi",
"Tunis": "Tunis",
"Tunis (city)": "Tunis"
我正在使用这个迭代:
di_cities = rf"\bk\b": v for k, v in di_cities.items()
df_cities_clean = df.replace(di_cities, regex=True)
正如您在图片中看到的(最终结果),它适用于 Bamako、Agadez、Mopti 和每个单字字符串。不适用于任何带括号的字符串,以防 Birnin Konni 有点混乱。
我正在以类似的方式使用另一本字典,但每个字符串都在括号之间,rf"\(k\)"
工作得很好。
你能帮帮我吗?
Final result
【问题讨论】:
使用re.escape
。 \b
不会有帮助的。
试试di_cities = rf"\bre.escape(k)(?:(?<=\w)\b|(?<!\w))": v for k, v in di_cities.items()
。请注意,如果您的字典有重叠的键(那些是其他(s)的前缀),它可能不起作用。这也假设您的键始终以单词 char 开头。
感谢维克托!这对我来说几乎是完美的!它可以完成除 Konni 之外的所有工作,即重叠键(目前只有这个键),但我通过一种解决方法解决了
你需要什么结果?也许你应该简单地split(" (")
并获得第一个元素
太好了,下次请在评论中添加@username
,以通知该用户您的反馈。
【参考方案1】:
我建议使用
di_cities = rf"\bre.escape(k)(?:(?<=\w)\b|(?<!\w))": v for k, v in di_cities.items()
使用此字典理解,您可以创建另一个字典,其键为正则表达式,将以前的键匹配为整个单词,以单词字符开始(即数字、字母、下划线、连接标点符号)和 -如果它们以单词 chars 结尾 - 不会立即跟在另一个单词 char 之后。如果键不以单词 char 结尾,例如,如果它以标点符号或空格结尾(可能添加 .strip()
会使其更安全),则不会应用额外的边界检查。
rf"\bre.escape(k)(?:(?<=\w)\b|(?<!\w))"
首先转义 [all special regex metacharacters in] 键,然后在其前面加上单词边界,(?:(?<=\w)\b|(?<!\w))
是匹配的非捕获组
(?<=\w)\b
- 如果前面的 char 是单词 char,则为单词边界((?<!...)
是正向回溯)
|
- 或
(?<!\w))
- 如果当前位置左侧没有单词 char,则无需额外检查(匹配空字符串)((?<!...)
是否定的后视)。
【讨论】:
谢谢维克托!这完美无缺。你的解释也很清楚。以上是关于Python Pandas 和正则表达式使用字典替换 Dataframe 中的项目的主要内容,如果未能解决你的问题,请参考以下文章
Python(Pandas) - 我应该在这里使用哪种正则表达式语法?
尝试在 Python / pandas 中使用正则表达式获取子字符串
Python Pandas:使用正则表达式用超链接替换字符串