如何将地图与具有正则表达式键的字典一起使用?

Posted

技术标签:

【中文标题】如何将地图与具有正则表达式键的字典一起使用?【英文标题】:How to use map with a dictionary having regular expression keys? 【发布时间】:2020-02-09 01:35:37 【问题描述】:

我有一个带有我想要映射的变量的 DataFrame,使用的字典不是“普通”字符串,而是正则表达式。

import pandas as pd
import re
df = pd.DataFrame('cat': ['A1', 'A2', 'B1'])

我想做的是df['cat'].map('A\d': 'a', 'B1': 'b'),但A\d 似乎没有被解释为正则表达式。在这个简单的 MWE 中,我可以做到 df['cat'].map('A1': 'a', 'A2': 'a', 'B1': 'b'),但在现实世界中,正则表达式要复杂得多。而且字典要复杂得多,因此the solution here(需要添加开始和结束语句并在键周围应用re.compile)是不可行的。

【问题讨论】:

【参考方案1】:

使用replaceregex=True

map 需要一个可调用对象。当您将字典传递给它时,它会将字典替换为lambda x: your_dict.get(x, x)。对于您的目的,replace 是合适的。

df.replace('A\d': 'a', 'B1': 'b', regex=True)

  cat
0   a
1   a
2   b

【讨论】:

呃,听起来好得令人难以置信。但它有效。虽然,replacemap 有点不同。【参考方案2】:

我不确定你的字典有多复杂。但如果不是太长,我们可以一一匹配替换:

maps = 'A\d': 'a', 'B1': 'b'
(pd.concat((df['cat'].str.match(k) for k in maps), axis=1, ignore_index=True)
  .dot(pd.Series(d for k,d in maps.items()))
)

输出:

0    a
1    a
2    b
dtype: object

【讨论】:

以上是关于如何将地图与具有正则表达式键的字典一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

字典键上的正则表达式匹配

将 BeautifulSoup 4 的 `find_all` 与正则表达式一起使用时,如何访问正则表达式匹配捕获组?

正则表达式:如何将 re.sub 与可变数量的元素一起使用?

将正则表达式与斜纹一起使用

将RegEx(正则表达式提取器)与JMeter一起使用

如何在 shell 脚本中将此正则表达式与 grep 一起使用?