【问题标题】:RegEx to split address into three distinct Series [Part 2]RegEx 将地址拆分为三个不同的系列 [第 2 部分]
【发布时间】: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


【解决方案1】:

这种模式可以提供帮助:

(\D+)\s((\d+[\s-]?(?!b)\w*)(?:\s+b\.)?(\S+)?)*

【讨论】:

  • 不幸的是,当 numberbox 信息丢失时它不起作用。服务here.
猜你喜欢
  • 2019-12-09
  • 1970-01-01
  • 2021-06-18
  • 2022-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
相关资源
最近更新 更多