python - 在 Python/pandas 中使用正则表达式查找城市名称

标签 python regex pandas

我有一个 pandas 字符串数据帧,其中包含一些随机的字母字符串,后跟一个潜在的城市和州。但间距不规则。

例如,我感兴趣的解析列看起来像

blah burlingtonvt
blahessex vt
blah dover vt
blahnorthchittendenvt
blah essex junctionvt

将每个“blah”替换为我想要保留的一些字母数字字符(每行可能不同)以及数十万个观察结果以及美国大陆各地的城市和州。由于状态代码始终出现在末尾,因此我可以使用正则表达式轻松提取它,例如

(ny$|tx$|vt$|...)

其中“...”只是您所期望的其余州。然后,我分别处理每个状态的 DataFrame 的每个子集。我有一个给定州的所有可能的城市“错误间距”的列表,我已将其制成正则表达式。即,

x = '(essex[ ]{0,1}junction|north[ ]{0,1}chittenden|essex|...)'

此正则表达式中城市名称变体的数量有时会达到数千个。然后我运行以下行

df['city'] = df['string'].str.extract(x, expand=True)

返回

  string                  state   city
1 blah waterbury cenvt    vt      waterbury
2 blah waterbury vt       vt
3 blah waterbury vt       vt
4 blah vt                 vt
5 blah shelburne vt       vt
6 blah waterbury vt       vt
7 blah richmond vt        vt      richmond

但如果我运行,例如,

df['city'] = df['string'].str.extract('(waterbury|shelburne|richmond)', expand=True)

结果如预期。为什么会出现这样的情况呢?我以编程方式生成正则表达式,所以我想说这不是因为拼写错误。是否有可能是因为要寻找的东西太多了?有更好的方法吗?

编辑:事实证明,在数千个城市名称中隐藏着一个我认为不会存在的空字符串。

最佳答案

考虑以下方法:

In [5]: lst = ['waterbury','shelburne','richmond']

In [6]: pat = '({})'.format('|'.join([r'\b{}\b'.format(x) for x in lst]))

In [7]: pat
Out[7]: '(\\bwaterbury\\b|\\bshelburne\\b|\\brichmond\\b)'

In [8]: df['string'].str.extract(pat, expand=True)
Out[8]:
           0
0  waterbury
1  waterbury
2  waterbury
3        NaN
4  shelburne
5  waterbury
6   richmond

关于python - 在 Python/pandas 中使用正则表达式查找城市名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45769231/

相关文章:

python - 已知结构矩阵的 NumPy 矩阵乘法效率

php - preg_match 从字符串返回多个值

python - 如何构建自定义 pandas.tseries.offsets 类?

python - 为 Pandas 中列的子集添加值

我的 PC 中的 Python 版本显示 2.7.17 而不是 3.8.5

python - 使用 Python 多处理进程/队列的奇怪错误

javascript - RegEx(在 JavaScript 中查找/替换)- 匹配非字母数字字符但忽略 - 和 +

python - 二值化数据框列并相应地拆分其他列值

python - 如何使用 Selenium、Python 从 Google 搜索中提取链接

java - 正则表达式忽略两个字符串之间的字符?