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)(?:(?&lt;=\w)\b|(?&lt;!\w))" 首先转义 [all special regex metacharacters in] 键,然后在其前面加上单词边界,(?:(?&lt;=\w)\b|(?&lt;!\w)) 是匹配的非捕获组

(?&lt;=\w)\b - 如果前面的 char 是单词 char,则为单词边界((?&lt;!...) 是正向回溯) | - 或 (?&lt;!\w)) - 如果当前位置左侧没有单词 char,则无需额外检查(匹配空字符串)((?&lt;!...) 是否定的后视)。

【讨论】:

谢谢维克托!这完美无缺。你的解释也很清楚。

以上是关于Python Pandas 和正则表达式使用字典替换 Dataframe 中的项目的主要内容,如果未能解决你的问题,请参考以下文章

Python(Pandas) - 我应该在这里使用哪种正则表达式语法?

尝试在 Python / pandas 中使用正则表达式获取子字符串

Python Pandas:使用正则表达式用超链接替换字符串

用于各种日期的 Python/Pandas 正则表达式 [重复]

从 python 中成功的正则表达式匹配构建字典

使用正则表达式解析多个文本字段并编译成 Pandas DataFrame