【发布时间】:2019-08-02 10:20:22
【问题描述】:
这是我 previous post 关于使用正则表达式将包含地址的熊猫系列拆分为三个不同字段(街道、数字和框)。
我最初的例子如下:
import pandas as pd
import numpy as np
df = pd.DataFrame({'cus_name' : ['James', 'Mary', 'David', 'Linda', 'George', 'Jennifer', 'John', 'Maria', 'Charles', 'Helen'],
'address' : ['Main St 59', 'Yellow Av 11 b.F1', 'Terrazzo Way 100-102', np.nan, 'Hamilton St 159 b.A/B', np.nan, 'Henry St 7 D', 'Mc-Kenzie Av 40P b.1', 'Neptune Av 14 15 b.G', np.nan ],
'postal_code' : [1410, 1210, 1020, np.nan, 1310, np.nan, 1080, 1190, 1040, np.nan],
})
print(df)
cus_name address postal_code
0 James Main St 59 1410.0
1 Mary Yellow Av 11 b.F1 1210.0
2 David Terrazzo Way 100-102 1020.0
3 Linda NaN NaN
4 George Hamilton St 159 b.A/B 1310.0
5 Jennifer NaN NaN
6 John Henry St 7 D 1080.0
7 Maria Mc-Kenzie Av 40P b.1 1190.0
8 Charles Neptune Av 14 15 b.G 1040.0
9 Helen NaN NaN
使用 RomanPerekhrest 给出的解决方案中的正则表达式模式,address 系列很好地拆分为 3 个所需字段。
pattern = pattern ='(\D+)\s+(\d+[\s-]?(?!b)\w*)(?:\s+b\.)?(\S+)?'
print(df['address'].str.extract(pattern, expand = True))
0 1 2
0 Main St 59 NaN
1 Yellow Av 11 F1
2 Terrazzo Way 100-102 NaN
3 NaN NaN NaN
4 Hamilton St 159 A/B
5 NaN NaN NaN
6 Henry St 7 D NaN
7 Mc-Kenzie Av 40P 1
8 Neptune Av 14 15 G
9 NaN NaN NaN
很遗憾,在我之前的帖子中,我没有说明地址仅包含街道信息(例如Place de la Monnaie)的情况。
在这种情况下,上述正则表达式模式不再起作用。请参阅this regex101 链接。
我尝试修改正则表达式模式半小时以解决这种情况,但没有成功。我注意到的是,即使 number 字段可以包含单词字符,它在非缺失时总是以数字开头。
任何额外的帮助将不胜感激。
【问题讨论】:
-
你不能把数字也设为可选吗?见regex101.com/r/cz2E9w/1
-
对不起,我没有时间简化这个正则表达式,但这应该可以工作:
\D+$|(\D+)\s+(\d+[\s-]?(?!b)\w*)(?:\s+b\.)?(\S+)?
标签: python regex pandas dataframe