【问题标题】:Python Pandas and regex in replacing items in Dataframe using dictionaryPython Pandas 和正则表达式使用字典替换 Dataframe 中的项目
【发布时间】: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"\b{k}\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"\b{re.escape(k)}(?:(?<=\w)\b|(?<!\w))": v for k, v in di_cities.items()}。请注意,如果您的字典有重叠的键(那些是其他(s)的前缀),它可能不起作用。这也假设您的键始终以单词 char 开头。
  • 感谢维克托!这对我来说几乎是完美的!它可以完成除 Konni 之外的所有工作,即重叠键(目前只有这个键),但我通过一种解决方法解决了
  • 你需要什么结果?也许你应该简单地split(" (") 并获得第一个元素
  • 太好了,下次请在评论中添加@username,以通知该用户您的反馈。

标签: python regex pandas dataframe dictionary


【解决方案1】:

我建议使用

di_cities = {rf"\b{re.escape(k)}(?:(?<=\w)\b|(?<!\w))": v for k, v in di_cities.items()}

使用此字典理解,您可以创建另一个字典,其键为正则表达式,将以前的键匹配为整个单词,以单词字符开始(即数字、字母、下划线、连接标点符号)和 -如果它们以单词 chars 结尾 - 不会立即跟在另一个单词 char 之后。如果键不以单词 char 结尾,例如,如果它以标点符号或空格结尾(可能添加 .strip() 会使其更安全),则不会应用额外的边界检查。

rf"\b{re.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;!...) 是否定的后视)。

【讨论】:

  • 谢谢维克托!这完美无缺。你的解释也很清楚。
猜你喜欢
  • 2013-08-13
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 2021-11-12
  • 1970-01-01
相关资源
最近更新 更多