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

时间:2017-08-19 08:06:20

标签: python regex pandas

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

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

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)

结果符合要求。为什么会这样呢?我以编程方式生成正则表达式,所以我想说这不是因为拼写错误。它是否有可能因为有太多东西需要寻找?有更好的方法吗?

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

1 个答案:

答案 0 :(得分:2)

考虑以下方法:

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